Object über statische Variable der Klasse ansprechen, wie geht das sinnvoll?



  • Ich habe die Klasse World, diese soll bei der Erstellung myself = this machen wobei myself statisch ist und über die statische Funktion GetWorld() returnt wird.

    Soweit wie ich bislang Pointer und Referenzen verstanden habe, wäre es das sinnvollste dieses über eine Referenz zu machen. (Ein Singleton brauche ich nicht, myself soll ledigtlich auf die zuletz erstellte World zeigen.

    World.h

    class World{
    public:
    	World();
    	~World();
    	static World GetWorld();
    private:
    
    	static World myself;
    };
    

    World.cpp

    World::World(){
    	this->IsRunning = false;
    	IsMove = false;
    	&myself = this;
    }
    
    World World::GetWorld(){
    	return myself;
    }
    

    Mein Hauptproblem ist wahrscheinlich, das ich nicht weiß wo ich die & setzen muss.



  • Mal Zeiger, mal Referenz.

    class World{
    public:
    	World();
    	~World();
    	static World& GetWorld();
    private:
    	static World* myself;
    };
    

    World.cpp

    World::World(){
    	this->IsRunning = false;
    	IsMove = false;
    	myself = this;
    }
    
    World& World::GetWorld(){
    	return *myself;
    }
    


  • Ich finde deine Vorgehensweise etwas merkwürdig, aber okay.

    Du solltest einen statischen Zeiger auf die aktuelle Welt machen, und nicht eine Instanz. Dann reicht auch

    myself = this;
    

    Denn momentan versuchst du, die Adresse des myself -Objekts zu ändern, was natürlich nicht geht.



  • Hm volkard, stammt von dir der c++ kurs?

    Also wenn ich deinen Code richtig verstehe:

    Ich setze myself asl Pointer auf meine Welt,
    wenn nun etwas GetWorld() aufruft, gebe ich eine Referenz auf das im Pointer verwiesene Object zurück.

    Bleibt die frage, wieso brauche ich den Pointer? , warum kann myself nciht gleich eine Referenz auf die Welt enthalten?

    zu Nexus, wie meinst du das? (und wie wirkt es sich auf den Code aus?)



  • Empire Phoenix schrieb:

    zu Nexus, wie meinst du das? (und wie wirkt es sich auf den Code aus?)

    Ich habe genau das Gleiche gemeint wie volkard (meine Zeile kommt in seinem Code vor), war nur etwas langsamer.

    Du musst einen Zeiger nehmen, weil du Referenzen während ihrer Lebensdauer nicht auf unterschiedliche Objekte verweisen lassen kannst.



  • Empire Phoenix schrieb:

    Hm volkard, stammt von dir der c++ kurs?

    Ja.

    Also wenn ich deinen Code richtig verstehe:
    Ich setze myself asl Pointer auf meine Welt,
    wenn nun etwas GetWorld() aufruft, gebe ich eine Referenz auf das im Pointer verwiesene Object zurück.

    Völlig korrekt.

    Bleibt die frage, wieso brauche ich den Pointer? , warum kann myself nciht gleich eine Referenz auf die Welt enthalten?

    Weil DU erst bei der Erzeugung einer Welt den Zeiger setzen wolltest. Einen Zeiger kannst Du jederzeit ändern, daß er auf was anderes zeigt. Eine Referenz kann das nicht, sie muß bei Erzeugung gleich das kriegen, worauf sie "zeigt" und wird für immer auf das selbe Objekt "zeigen".



  • Hm irgetwie gibt es immer noch Fehler:

    C:/workspace/FallDown/Debug/../src/World.cpp:15: undefined reference to `World::myself'
    src\World.o: In function `ZN5WorldC1Ev':
    C:/workspace/FallDown/Debug/../src/World.cpp:15: undefined reference to `World::myself'
    src\World.o: In function `ZN5World8GetWorldEv':
    C:/workspace/FallDown/Debug/../src/World.cpp:19: undefined reference to `World::myself'
    

    Zeile 15 ist:

    World::World(){
    	myself = this; //diese hier
    }
    

    Zeile 19 ist:

    World& World::GetWorld(){
    	return *myself; //diese hier
    }
    

    Und der vollständigkeit halber die .h

    class World{
    public:
    	World();
    	~World();
    	static World& GetWorld();
    private:
    
    	static World* myself;
    };
    

    Nichtrelevantes natürlich rausgekürzt



  • World* World::myself;//neu
    
    World::World(){
    	myself = this; //diese hier
    }
    

    Die static-Sache in der klasse hat nur die variable deklariert, ohne speicherplatz zu besorgen. hier wird jetzt sogar der speicherplatz besorgt. deswegen auch in der *.cpp, damits nur einmal ist.



  • Super, danke nochmals für die Hilfe, das Mini-Spiel läuft jetzt problemlos.


Anmelden zum Antworten