Liste con diversi oggetti

di il
33 risposte

Liste con diversi oggetti

Buongiorno a tutti, sono nuovo del forum, ma non di C++: ci sto lavorando da un mesetto
Volevo chiedere una cosa molto importante, è possibile creare liste di oggetti diversi, cioè non dello stesso tipo?
Per esempio:
//lista di numeri interi
int lista[];
//lista di stringhe
#include <iostream>
using namespace std;
string lista[];
//lista di int e string insieme
???
Grazie in anticipo a tutti

33 Risposte

  • Re: Liste con diversi oggetti

    eliteXXL ha scritto:


    Buongiorno a tutti, sono nuovo del forum, ma non di C++: ci sto lavorando da un mesetto
    Praticamente niente.
    Volevo chiedere una cosa molto importante, è possibile creare liste di oggetti diversi, cioè non dello stesso tipo?
    No. E tra l'altro con int lista[] non crei una lista, ma un array che è obbligatorio inizializzare immediatamente per dargli una dimensione. Altrimenti è un errore di compilazione.
  • Re: Liste con diversi oggetti

    Ok, e c'è un modo per compensare?
    cmq sono nuovo di c++, ma ho studiato python, php e javascript...
  • Re: Liste con diversi oggetti

    Il C++ è completamente diverso da quei linguaggi. La tipizzazione dei dati è statica, non dinamica. Questo significa che il tipo di dato non può essere cambiato a piacimento (eccezion fatta per i puntatori e assumendosi ogni rischio per questo), ma è fissato quando scrivi il codice. In altre parole il C++ non ha il tipo variant. E' possibile costruirselo, ma serve una classe template polimorfica intermedia stile boost::any e un cast apposito.
    Una soluzione più error prone consiste nell'usare un puntatore void*, ma così facendo perdi la conoscenza del tipo originario e devi sapere tu e in ogni momento cosa rappresenti quel puntatore: al minimo sbaglio esplode tutto.
    Per quel che vale, posso solo consigliarti di assimilare bene l'uso dei puntatori in C++ dato che sono loro la causa del 90% dei problemi.
  • Re: Liste con diversi oggetti

    La tua è una semplice curiosità oppure hai un problema concreto? In questo caso se ce lo spieghi possiamo discutere di come di solito lo si risolve in C++.
  • Re: Liste con diversi oggetti

    No no, non è una curiosità, purtroppo. Praticamente sto sviluppando un gioco con Ogre (ero partito da Blender che utilizza python, ma visto che Ogre è sviluppato anche in Direct X allora ho preferito usare quest'ultimo). Siccome sono abituato a Blender volevo rendere lo sviluppo in Ogre il più simile possibile a come si fa in Blender, quindi ho cominciato a creare delle classi GameObject che dovrebbero contenere i sensori, i controllori e gli attuatori a esso collegati. Ma ci sono diversi tipi di sensori, controllori e attuatori, quindi ho bisogno di creare più classi. Ogni sensore deve stare dentro una lista nel GameObject chiamata sensors, ogni controllore in una chiamata controllers, ogni attuatore in una chiamata actuators. Qui sorge il problema: siccome ogni sensore, controllore e attuatore può essere di tipo diverso, ma comunque devono stare tutti nella stessa lista, come posso fare?
  • Re: Liste con diversi oggetti

    Ciao eliteXXL,
    perfetto, questo è un classico!

    Hai diversi tipi di sensori, ma alla fine sono sensori. Quindi esisterà una classe Sensore e delle classi derivate SensoreDiTipo1, SensoreDiTipo2 ecc. Queste classi vengono allocate dinamicamente tramite la new e poi inserite in liste di puntatori a Sensore. A questo punto prima di proseguire dovresti avere chiaro i concetti di ereditarietà e polimorfismo, se ha dei dubbi conviene toglierli prima di andare avanti.
  • Re: Liste con diversi oggetti

    Siccome sono nuovo di C++, l'unico dubbio che ho è la sintassi per creare la lista di puntatori a Sensore, etc....
  • Re: Liste con diversi oggetti

    Puoi farlo in diversi modi, puoi usare i vecchi array tipo C o le classi contenitore del C++, ad esempio:
    
    #include <vector>
    using namespace std;
    
    class Sensore
    {
    public:
    	virtual bool GetStatus()  = 0;
    };
    
    class SensoreDiTipo1: public Sensore
    {
    public:
    	virtual bool GetStatus() 
    	{
    			return 1; // per test, poi la implementi giusta
    	}
    };
    
    int main()
    {
        std::vector<Sensore*> sensori;
        Sensore* s1 = new SensoreDiTipo1();
        sensori.push_back(s1);
    	
        // oppure
    
        Sensore** altriSensori = new Sensore* [100];
        Sensore* s2 = new SensoreDiTipo1();
        altriSensori[0] = s2;
    
         return 0;
    }
    
    Alla fine poi dovrai distruggere gli oggetti creati.
  • Re: Liste con diversi oggetti

    Ok, capito. Ora mi sto leggendo un po' di cose sui puntatori e simili, comunque in che senso "Alla fine poi dovrai distruggere gli oggetti creati."?
  • Re: Liste con diversi oggetti

    Nel senso che quando allochi un oggetto con la new, devi poi distruggerlo con la delete:
    
    p = new Qualcosa; // lo crei e occupi spazio in memoria
    
    ... lo usi e quando non ti serve più lo elimini e lo togli dalla memoria
    
    delete p;
    
  • Re: Liste con diversi oggetti

    Ok, ora faccio delle prove e se qualcosa non funge, chiedo. Grazie ancora
  • Re: Liste con diversi oggetti

    Ho un altro problema: ho creato un vector (ora non per i sensori ma per una lista di oggetti) e quando faccio per iterare il vector mi da errore. La funzione che mi da errore è questa:
    
    class GameObjectsList{
    private:
    	vector<GameObject*> objects;
    public:
    	GameObject *getOb(Ogre::String name){
    		vector<GameObject*>::iterator it;
    		for (it=objects.begin(); it!=objects.end(); ++it){
    			if ((*it)->getName()==name){
    				return (*it);
    			}
    		}
    		return NULL;
    	};
    }
    //ovviamente della classe ho messo solo una parte...
    
    Mi si blocca su begin....
  • Re: Liste con diversi oggetti

    Niente, risolto....
  • Re: Liste con diversi oggetti

    Non vale, avevo già preparato la risposta!

    Questo era un pezzo di codice funzionante, te lo posto comunque:
    
    #include <string>
    #include <vector>
    using namespace std;
    
    class GameObject
    {
    private:
    	string name;
    
    public:
    	GameObject(string name)
    	{
    		this->name = name;
    	}
    
    	string GetName() 
    	{
    		return name; 
    	}
    };
    
    class GameObjectsList
    {
    private:
       vector<GameObject*> objects;
    
    public:
    	void Add(GameObject* object)
    	{
    		objects.push_back(object);
    	}
    
        GameObject *GetObject(string name)
    	{
    		vector<GameObject*>::iterator it;
    		for (it	= objects.begin(); it != objects.end(); ++it)
    		{
               if ((*it)->GetName() == name)
    		   {
    				return *it;
               }
          }
          return NULL;
       };
    };
    
    int main()
    {
    	GameObjectsList list;
    	list.Add(new GameObject("Luigi"));
    	list.Add(new GameObject("Antonio"));
    	list.Add(new GameObject("Piero"));
    
    	
    	GameObject* p = list.GetObject("Antonio");
    	
    	string s;
    	if (p)
    	{
    		s = p->GetName();
    	}
    
        return 0;
    }
    
    E nel tuo non avevo capito cosa andava.
Devi accedere o registrarti per scrivere nel forum
33 risposte