Problem mit Standardkonstruktor und Membervariablen



  • Hi,

    ich habe folgende Beispielklasse mit Testaufruf:

    class test1 {
    	test1() {
    		this->text = "test1()";
    	}
    public:
    	test1(std::string text) {
    		test1::test1();
    		::MessageBox(0, this->text.c_str(), "", MB_OK);
    	}
    
    	std::string text;
    };
    
    test1* t1 = new test1("mytext");
    

    Der Sinn soll sein, dass der Standardkonstruktor die Membervariablen initialisiert und der andere Konstruktor nur die nötigen Werte angleicht und dann weiter macht. Später auch für Vererbung, da dann ja der Standardkonstruktor der Basisklasse aufgerufen wird.

    Mein Problem ist nun, dass die Membervariable "text" nicht mit dem Text im Standardkonstruktor gefüllt wird, die Messagebox ist immer leer. 😞

    Jmd ne Idee, wie ich das lösen kann?



  • Mit deiner Variable läuft alles korrekt, aber da du im zweiten Konstruktor den Parameter ebenfalls "text" genannt hast, gibt MessageBox genau den aus.

    Moritz



  • Oh, ziemlich schnelle Antwort, danke schonmal, aber das war's nicht.

    Wenn ich den Parameter im zweiten Konstruktor von "text" auf "text2" beispielsweise ändere, dann ist "this->text" immernoch leer. 😞



  • class test1 {
    	test1() {
    		this->text = "test1()";
    	}
    public:
    	test1(std::string text) {
    		/* test1:: */ test1(); // test1:: weglassen
    		MessageBox(0, this->text.c_str(), "", MB_OK);
    	}
    
    	std::string text; // sollte vor der Definition des Konstruktors stehen
    };
    


  • Ich hab's jetzt so:

    class test1 {
    	test1() {
    		this->text = "test1()";
    	}
    public:
    	std::string text;
    	test1(std::string text2) {
    		test1();
    		::MessageBox(0, this->text.c_str(), "", MB_OK);
    	}
    
    };
    

    funzt trotzdem nicht. Hab's auch versucht die Membervariable vor den ersten Konstruktor zu packen, hat auch nichts gebracht.

    Wenn Du noch eine Idee hast, immer her damit. 🙂

    // Edit:
    Habe jetzt noch ein wenig rumgespielt und eine zweite Funktion "test2()" zum setzen der Membervariablen eingebaut, wenn ich diese im 2. Konstruktor aufrufe, dann wird die Variable erwartungsgemäß gesetzt, nur, wenn ich im 2. Konstruktor den 1. Konstruktor zum setzen der Variable aufrufe, dann funzt das nicht. Funktioniert das grundsätzlich nicht, oder mache ich da was falsch?
    Ansonsten müsste ich mir in einem solchen Fall immer eine Init-Funktion schreiben, aber ich dachte mir, dass Konstruktoren ja eigentlich genau dem Zweck des Initialisierens dienen sollen und eigentlich kann es ja keine Lösung sein, dass ich die Initialisierung in jeden Konstruktor reinschreibe, Änderungen könnten da ziemlich aufwendig werden. 🙂





  • Alles klar, vielen Dank für den Link.
    Verstehe aber trotzdem nicht, wieso ich jede andere Methode im Konstruktor aufrufen kann, aber einen anderen Konstruktor nicht. Bzw. aufrufen kann ich ja, hat nur leider keinen Effekt auf die Members. 😕



  • mantiz schrieb:

    Verstehe aber trotzdem nicht, wieso ich jede andere Methode im Konstruktor aufrufen kann, aber einen anderen Konstruktor nicht. Bzw. aufrufen kann ich ja, hat nur leider keinen Effekt auf die Members. 😕

    Bei test1() oder meinetwegen auch test1::test1() wird ein anonymes temporäres Objekt erstellt (und gleich danach wieder zerstört). Es wird *nicht* einfach der Konstruktor aufgerufen. Das geht überhaupt nicht. Für das, was du vorhast, würde es sich anbieten, die gemeinsamen Initialisierungen in eine private Initialisierungsmethode auszulagern, und die dann von allen überladenen Konstruktoren aus aufzurufen.

    Temporäre Objekte braucht man zb bei sowas:

    test1 funktion() {
      return test1("hallo");
    }
    

    HTH



  • Jo, wer lesen kann ist klar im Vorteil ...
    Stand bei obigem Link bereits mit dem temporären Objekt, aber irgendwie hab' ich's zwar gelesen, aber nicht wirklich registriert, was da stand. 😞

    Jetzt ist es jedenfalls klar.

    Vielen Dank!


Anmelden zum Antworten