Liste con diversi oggetti

di il
33 risposte

33 Risposte - Pagina 2

  • Re: Liste con diversi oggetti

    Ahah grazie Cmq ora c'è un altro problema >.<
    Praticamente nella lista ho degli oggetti GameObject, però ho bisogno di cambiare il tipo di uno con uno derivato da GameObject quindi uso:
    
    void assign(string name; GameObject *newObj){
        vector<GameObject*>::iterator it;
        bool found=false;
        int index=0;
        for (it=objects.begin(); it!=objects.end(); ++it){
            if ((*it)->getName()==name){
                found=true;
                break;
            }
            index++;
        }
        if (found){
            objects[index]=newObj;
        }
    };
    
    Però newObj in realtà non sarà di classe GameObject, ma di una classe derivata, però quando faccio
    
    GameObjDer *obj;
    listaOggetti.assign("nomeOggetto", obj);
    listaOggetti.getObject("nomeOggetto")->update();
    
    , richiama la funzione update di GameObj e non di GameObjDer... Come faccio per risolvere
  • Re: Liste con diversi oggetti

    Devi dichiarare quei metodi come 'virtuali', ecco un esempio (ho continuato quello di prima).
    
    #include <string>
    #include <vector>
    using namespace std;
    
    class GameObject
    {
    protected:
    	string name;
    
    public:
    	GameObject(string name)
    	{
    		this->name = name;
    	}
    
    	virtual string GetName() 
    	{
    		return name; 
    	}
    };
    
    class OtherGameObject: public GameObject
    {
    public:
    	OtherGameObject(string name)
    		: GameObject(name)
    	{
    	}
    
    	virtual string GetName() 
    	{
    		return string("Signor " ) + 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 OtherGameObject("Piero"));
    
    
    	string s1;
    	string s2;
    
    	GameObject* p1 = list.GetObject("Antonio");
    	GameObject* p2 = list.GetObject("Signor Piero");
    
    	if (p1)
    	{
    		s1 = p1->GetName();
    	}
    
    	if (p2)
    	{
    		s2 = p2->GetName();
    	}
    
    	return 0;
    }
    
    La funzione virtuale è la 'GetName' e come vedi viene richiamata quella giusta.
  • Re: Liste con diversi oggetti

    Grazie, ora provo e faccio sapere
  • Re: Liste con diversi oggetti

    ... mi da errore sulla funzione che ho impostato come virtual...
  • Re: Liste con diversi oggetti

    Ho qualche problema a capire gli errori nel codice che non vedo.
    Se lo posti magari qualcosa risco a dirti.
  • Re: Liste con diversi oggetti

    È lunghissimo quindi metto solo le cose importanti

    questo è parte dell'header:
    class GameObject{
    private:
    	Ogre::String name;
    
    	Ogre::SceneNode *mSceneNode;
    public:
    	GameObject(Ogre::SceneNode *node){
    		mSceneNode=node;
    		name=node->getName();
    	};
    	GameObject(){};
    
    	Ogre::String getName(){
    		return name;
    	};
    
    	virtual void update(){};
    };
    
    class GameObjectsList
    {
    private:
    	vector<GameObject*> objects;
    public:
    	GameObjectsList(vector<GameObject*> objs){
    		objects=objs;
    	};
    	GameObjectsList(){};
    
    	GameObject *getOb(int index){
    		vector<GameObject*>::iterator it;
    		int i=0;
    		for (it=objects.begin(); it!=objects.end(); ++it){
    			if (i==index){
    				return (*it);
    			}
    			i++;
    		}
    		return NULL;
    	};
    	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;
    	};
    
    	void push_back(GameObject *obj){
    		objects.push_back(obj);
    	};
    
    	void assign(Ogre::String name, GameObject *newObj){
    		vector<GameObject*>::iterator it;
    		bool found=false;
    		int i=0;
    		for (it=objects.begin(); it!=objects.end(); ++it){
    			if ((*it)->getName()==name){
    				found=true;
    				break;
    			}
    			i++;
    		}
    		if (found){
    			objects[i]=newObj;
    		}
    	};
    
    	void update(){
    		for (int i=0; i!=-1; i++){
    			GameObject *obj=getOb(i);
    			if (obj){
    				obj->update();
    			}
    			else{
    				break;
    			}
    		}
    	};
    };
    
    class Character : public GameObject
    {
    private:
    	Ogre::String name;
    
    	Ogre::SceneNode *mSceneNode;
    public:
    	Character(GameObject *obj){
    		name=obj->getName();
    		mGame=obj->getGame();
    		mSceneNode=obj->getSceneNode();
    	};
    
    	virtual void update(){
    		if (mGame->mKeyboard->isKeyDown(OIS::KC_I)){
    			mSceneNode->translate(Ogre::Vector3(0, 0, 1));
    		}
    	};
    };
    poi la funzione update di GameObjectsList viene richiamata ogni frame del gioco e mi da errore la funzione update di GameObject
  • Re: Liste con diversi oggetti

    Ma che errore ti segnala? È un errore di compilazione o a run-time?
  • Re: Liste con diversi oggetti

    Runtime
  • Re: Liste con diversi oggetti

    E allora mi sa che se non ho il programma completo posso fare ben poco. Io farei un giretto col debugger, cercherei il punto in cui c' è il problema e vedrei di capire cosa lo causa. Ma cosi a meno di un colpo di fortuna trovare l' errore è difficile. Se riesci a fare una versione ridotta del programma che si compila e in cui l' errore è ancora presente magari qualcosa si puo fare. Comunque comicia a fare qualche giro col debugger.
  • Re: Liste con diversi oggetti

    Comunque l'errore me l'ha dato da quando ho messo virtual la funzione update di GameObject..
  • Re: Liste con diversi oggetti

    Quel:
    
    for (int i=0; i!=-1; i++){
    
    non è sospetto?
  • Re: Liste con diversi oggetti

    È che volevo fare un ciclo continuo però mi ero scordato che esiste il while XD, comunque quel pezzo l'ho messo dopo dell'errore...
  • Re: Liste con diversi oggetti

    È come se la funzione diventa invisibile se è virtual, è sicuro che è l'unico modo per risolvere il problema?
  • Re: Liste con diversi oggetti

    eliteXXL ha scritto:


    Comunque l'errore me l'ha dato da quando ho messo virtual la funzione update di GameObject..
    E già, quando hai messo virtual hai cominciato ad usare la funzione derivata (prima non veniva chiamata) e l' errore è saltato fuori.
    
     virtual void update(){
          if (mGame->mKeyboard->isKeyDown(OIS::KC_I)){
             mSceneNode->translate(Ogre::Vector3(0, 0, 1));
          }
    
    Se l' errore è qui sarà facile trovarlo, sarà uno di quei puntatori a NULL, controlla col debugger il valore di mGame, mGame->mKeyboard e mSheneNode.
  • Re: Liste con diversi oggetti

    eliteXXL ha scritto:


    è che volevo fare un ciclo continuo però mi ero scordato che esiste il while XD, comunque quel pezzo l'ho messo dopo dell'errore...
    un modo per fare il loop infinito è anche questo:
    
    for(;;)
    {
      // ...
    }
    
Devi accedere o registrarti per scrivere nel forum
33 risposte