pointer holen



  • Hi,

    bitte verzeiht den komischen Titel.

    Also Ich versuche folgendes zu realisieren:

    std::vector<MeinObjekt*> ObjList;
    
    MeinObjekt* objekt=NULL;
    unsigned i = 0;
    
    getPointer(objekt, i);
    
    void getPointer(MeinObjekt* obj)
    {
    
        obj = objList->at(i);
    
    }
    

    Ich hätte gerne, dass objekt hinterher auf den Eintrag in der Liste zeigt.

    Innerhalb von getPointer geht es, aber danach ist es futsch. Was stimmt hier nicht?



  • ehrlich gesagt ist das kein Problem.

    was ich eigentlich versuche ist:

    std::vector<MeinObjekt*> ObjList;
    
    MeinGeerbtesObjekt* objekt=NULL;
    unsigned i = 0;
    
    getPointer(objekt, i);
    
    void getPointer(MeinObjekt* obj)
    {
    
        obj = objList->at(i);
    
    }
    

    Innerhalb von getPointer werden die richtigen Werte der geerbten Klasse angezeigt. Nur nach draußen will der Zeiger nicht.

    Mit getPointer(MeinObjekt** obj) geht es nicht, da sich anscheinend kein MeinGeerbtesObjekt** and MeinObjekt** übergeben lässt.

    MeinGeerbtesObjekt* and MeinObjekt* wiederum scheinen zu gehen.



  • ok, ich kann das objekt so holen.

    MeinObjekt obj;
    MeinObjekt* objekt=NULL;
    objekt = &obj;

    getPointer(objekt, i);

    aber es verändert sich nicht im speicher wenn ich was damit mache!



  • sorry ich meinte

    [source]
    MeinGeerbtesObjekt obj;
    MeinGeerbtesObjekt* objekt=NULL;
    objekt = &obj;

    getPointer(objekt, i);
    [/source]

    irgendwelche vorschläge oder workarounds?

    Ich möchte nicht für jede geererbte Klasse eigene Funktionen schreiben



  • #include "stdafx.h"
    #include <vector>
    #include <string>
    #include <iostream>
    
    class A
    {
    public:
    	A() : _i(0) {}
    	explicit A(int i) : _i(i) {}
    	virtual ~A() {}
    	void setInt(int i)
    	{
    		_i = i;
    	}
    	virtual void print() const
    	{
    		std::cout << "A::print() : _i = " << _i << std::endl;
    	}
    private:
    	int _i;
    };
    
    class B : public A
    {
    public:
    	B() {}
    	explicit B(const std::string& s) : _s(s) {}
    	void setString(const std::string& s)
    	{
    		_s = s;
    	}
    	virtual void print() const
    	{
    		A::print();
    		std::cout << "B::print() : _s = " << _s << std::endl;
    	}
    private:
    	std::string _s;
    };
    
    std::vector<A*> objList;
    
    // 1. Variante:
    A* getObject(unsigned int index)
    {
    	return objList.at(index);
    }
    
    // 2. Variante
    void getObject(A*& obj, unsigned int index)
    {
    	obj = objList.at(index);
    }
    
    // 3. Variante
    void getObject(A** obj, unsigned int index)
    {
    	*obj = objList.at(index);
    }
    
    int main()
    {
    	objList.push_back(new A(27));
    	objList.push_back(new B("test27"));
    
    	// 1. Variante
    	A* obj1 = getObject(0);
    	A* obj2 = getObject(1);
    
    	// Test
    	obj1->print();
    	obj1->setInt(28);
    	obj1->print();
    
    	B* obj2x = dynamic_cast<B*>(obj2);
    	if (obj2x != 0)
    	{
    		obj2x->print();
    		obj2x->setString("test28");
    		obj2x->print();
    	}
    
    	// 2. Variante
    	A* obj3 = 0;
    	getObject(obj3, 0);
    	A* obj4 = 0;
    	getObject(obj4, 1);
    
    	// Test
    	obj3->print();
    	obj3->setInt(29);
    	obj3->print();
    
    	B* obj4x = dynamic_cast<B*>(obj4);
    	if (obj4x != 0)
    	{
    		obj4x->print();
    		obj4x->setString("test29");
    		obj4x->print();
    	}
    
    	// 3. Variante
    	A* obj5 = 0;
    	getObject(obj5, 0);
    	A* obj6 = 0;
    	getObject(obj6, 1);
    
    	// Test
    	obj5->print();
    	obj5->setInt(30);
    	obj5->print();
    
    	B* obj6x = dynamic_cast<B*>(obj6);
    	if (obj6x != 0)
    	{
    		obj6x->print();
    		obj6x->setString("test20");
    		obj6x->print();
    	}
    
    	for (std::vector<A*>::const_iterator it = objList.begin(); it != objList.end(); ++it)
    	{
    		delete *it;
    	}
    	objList.clear();
    }
    

    Guck Dir die drei Varianten an.
    Simon



  • Hi, danke! Sieht gut aus!

    Ich werde den code mal langsam auf der Zunge zergehen lassen und später über meine Erfolge (oder Misserfolge) berichten.



  • Hey, geil! Hat funktioniert!

    Sieht etwas kryptisch aus, aber funktioniert.

    Würdest du sagen, dass das eine akzeptable Anwendung von vector ist?

    Wie sieht es mit der Performance aus? Ich versuche, mit dieser Form einen Objektmanager für eine Spiele Engine umzusetzen...



  • Hi,

    ich habe damit gerade meinen ersten Gehversuch mit Templates gemacht.

    template <class T>
    T ObjectManager::fetchObject(char *identifier, unsigned short i)
    {
    	std::map<std::string, Object*>::iterator it_id;
    
            it = ObjectList.find(identifier);
    
    	if (it == ObjectList.end()) return 0;
    	else
    	{
    		if(i>=it->second->GetChildList()->size()) return 0;
    		return it->second->GetChildList()->at(i);
    
    	}
    }
    

    Aber wenn ich das von einer anderen Klasse aus aufrufen will, kommt

    public: class Enemy * __thiscall ObjectManager::fetchObject<class Enemy *>(char *,unsigned short)" (??$fetchObject@PAVEnemy@@@ObjectManager@@QAEPAVEnemy@@PADG@Z)" in Funktion ""public: void __thiscall Horde::move(void)" (?move@Horde@@QAEXXZ)

    ich rufe es so auf

    int i=0;
    	Enemy *en;
    	while(en = objMgr.fetchObject<Enemy*>("enemy",i++))
    	{
                     //...
            }
    


  • So gehts.

    template <class T>
    		bool fetchObject(char *identifier, unsigned short i, T& retval)
    		{
    			std::map<std::string, Object*>::iterator it_id;
    
    			it_id = IdentifierList.find(identifier);
    
    			if (it_id == IdentifierList.end()) return 0;
    			else
    			{
    				if(i>=it_id->second->GetChildList()->size()) return 0;
    				retval = dynamic_cast<T>(it_id->second->GetChildList()->at(i));
    			}
    			return 1;
    		}
    

    Ergebnis: 20 FPS weniger 😃


Anmelden zum Antworten