TDM Geschrieben 5. März 2007 Teilen Geschrieben 5. März 2007 Hallo, ich habe vorhin etwas an meinem Visual Studio gespielt und mir fiel da was sonderbares auf: Eine Klasse foo die eine Funktion bar zur Textausgabe hat: class foo { public: foo () { m_text = _T(""); } void bar() { static CString staticText = "Welt"; if (m_text != _T("")) staticText = m_text; cout << (LPCTSTR) staticText << endl; } CString m_text; }; und die main: int main(void) { foo a, b; a.m_text = "hi"; a.bar(); b.bar(); return 0; } Mich wundert es, dass beim Ausführen des Programms 2 Mal "hi" ausgegeben wird. Gilt eine statische Variable in einer Memberfunktion wirklich für Instanzen dieser Klasse oder kann man das umgehen? (was zwar sinnlos wäre, da Membervariablen usw. aber egal) würde mich jedenfalls mal interessieren, weil ich bisher immer dachte, dass pro Instanz immer neue Funktionspointer erzeugt werden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. März 2007 Teilen Geschrieben 5. März 2007 Mich wundert es, dass beim Ausführen des Programms 2 Mal "hi" ausgegeben wird.Das ist aber richtig so. Gilt eine statische Variable in einer Memberfunktion wirklich für Instanzen dieser Klasse oder kann man das umgehen?Bei statischen Variablen ist es egal, ob sie in einer Member- oder eine freien Funktion stehen. Beim ersten Ausführen des Codes wird sie angelegt und initialisiert, und lebt danach bis zum Ende des Programms. Und es gibt sie genau einmal. weil ich bisher immer dachte, dass pro Instanz immer neue Funktionspointer erzeugt werden.Nein, das ist falsch. Alle Instanzen der Klasse teilen sich dieselbe Funktion. Wie soll das auch anders gehen? Soll bei dynamisch angelegten Objekten der Code im Speicher dupliziert werden? Allerdings hat natürlich jeder Aufruf einer Funktion seinen eigenen Satz lokaler (Auto-)Variablen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 5. März 2007 Autor Teilen Geschrieben 5. März 2007 hmm ok, hab mich nur gewundert. Also könnte man so z.B. eine statische Variable verstecken ? (etwa die Instanz einer Klasse, wenn sie ein Singelton ist) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. März 2007 Teilen Geschrieben 5. März 2007 Was meinst du mit "verstecken"? Was willst du denn erreichen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 5. März 2007 Autor Teilen Geschrieben 5. März 2007 Naja, da man in einer Klasse nicht die Instanz der Klasse selber anlegen kann, dachte ich mir folgendes: class CSingleton { public: CSingleton() { /* Memberinit */ } static const CSingleton& getInstance() { static CSingleton ton; return ton; }; }; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. März 2007 Teilen Geschrieben 5. März 2007 Naja, da man in einer Klasse nicht die Instanz der Klasse selber anlegen kann, dachte ich mir folgendes:Ja, das ist eine weit verbreitete Singleton-Implementierung. Aber ich verstehe immer noch nicht, wo das Problem ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 5. März 2007 Autor Teilen Geschrieben 5. März 2007 Das war ja nur ein Beispiel. Hauptsächlich gings mir drum, ob das normal ist, dass statische Variablen in nichtstatischen Funktionen von allen Membern geteilt werden. Aber das hattest du ja schon bestätigt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.