Membervariablen verschwinden



  • Hallo,

    es ist mal wieder ein mir unerklärliches Problem aufgetaucht:

    Ich habe zwei Konstruktoren

    settings_reader::settings_reader(string filename)
    {
    	etc_lib ETC;
    	if (ETC.file_exists(filename))
    		settings_reader(filename, true);
    	else
    		settings_reader(filename, false);
    }
    
    settings_reader::settings_reader(string filename, bool read_settingfile)
    {
    	m_filename = filename;
    	if (read_settingfile)
    		read_settings();
    }
    

    Ich rufe normalerweise den ersten Konstruktor auf. Der prüft, ob die Datei existiert und leitet dann an den zweiten Konstruktor um.

    Wenn ich nun gleich danach die Membervariable m_filename abrufe, ist sie leer.

    In einer anderen Methode wird ebenfalls eine Membervariable editiert. Vor dem Verlassen der Methode ist der Inhalt da, wenn ich gleich nach dem Beenden der Methode den Inhalt abfrage, ist er weg..

    Wenn ich zusätzlich m_filename auch im ersten Konstruktor den Wert zu weise, kann ich die Variable später auch wunderbar auslesen.

    Darf denn der erste Konstruktor keinen zweiten aufrufen?

    Ich danke euch schon mal.



  • Ulf schrieb:

    Darf denn der erste Konstruktor keinen zweiten aufrufen?

    Im neuen Standard gibt es soetwas. Ob das aber schon ein Compiler implementiert, weiß ich nicht. Ansonsten geht es nicht.



  • Ulf schrieb:

    settings_reader(filename, true);
    

    Da erzeugst du ein lokales Objekt, das hat gar nichts mehr mit this zu tun.



  • Der VS2010 Compiler unterstützt das definitiv nicht, weil ich das vor Kurzem auch machen wollte. Stichwort: Konstruktorverkettung.

    Workarround: Lagere den redundanten Code in eine Init() Function aus.



  • ok, ich danke euch!



  • Ulf schrieb:

    etc_lib ETC;
    	if (ETC.file_exists(filename))
    		settings_reader(filename, true);
    	else
    		settings_reader(filename, false);
    

    Das lässt sich auch kürzer schreiben:

    settings_reader(filename, etc_lib().file_exists(filename));
    

    Ändert natürlich nichts daran, dass du hier ein temporäres Objekt erstellst und nicht mehr auf this arbeitest.


Anmelden zum Antworten