Statisches lokales Objekt



  • Hallo,

    ich hätte mal eine grundsätzliche Frage zu folgendem kleinen (lauffähigem) Programm.

    file.hpp:

    class myClass {
    public:
    	static myClass& instance() {
    		static myClass obj;
    		return obj;
    	}
    
    	void myFunc(void);
    
    	int var;
    };
    

    file.cpp:

    #include "file.hpp"
    
    void myClass::myFunc(void) {	
    	var = 5678;
    }
    
    void func(void) {
    	myClass::instance().var = 1234;
    }
    
    void main(void) {
    	myClass i = myClass::instance();
    	i.myFunc();
    	func();
    	int res = i.var; // res = 5678
    }
    

    Kann mir jemand erklären, warum die Zuweisung in func() keine Auswirkung hat? Also warum res=5678 und nicht res=1234 ist.
    Schließlich sollte das statische lokale Objekt obj ja einmal am Anfang initialisiert werden und dann über mehrere Aufrufe bestehen bleiben, oder?

    Ist wahrscheinlich eine absolut triviale Geschichte, ab ich raffe das irgendwie nicht 🙄

    Danke!!



  • Weil myClass i = ... eine Kopie erzeugt, und diese Kopie ne eigene "var" Variable hat.



  • Danke für die schnelle Antwort 🙂

    Gibt es denn auch eine Möglichkeit wie ich myClass::instance().var verkürzen kann?

    Hatte die Zuweisung myClass i = myClass::instance() nämlich eigentlich deswegen durchgeführt, damit ich den Zugriff auf var mittels i.var abkürzen kann 😉

    Ziemlich lächerlich, ich weiß 😃



  • Dafür verwendet man Referenzen, also myClass& i = myClass::instance(); (das & dort sagt dir, daß i keine neue Variable ist, sondern nur ein Verweis auf deine bestehende Instanz).

    (PS: Zu einem ordentlichen Singleton gehört aber zumindest, die Kopier-Operationen zu verbieten 😉 Dann hindert dich schon der Compiler an solchen Aktionen)



  • Danke an euch beide! Ihr habt mir echt den Abend gerettet 🙂


Log in to reply