C++ Konstruktor problem



  • Hallo Leute!

    Ich möchte aus einem Konstruktor heraus einen anderen Konstruktor aufrufen, der die standard-initialisierung übernimmt.
    Leider weiß ich nicht wie das geht.
    this->A(..) funktioniert nicht und auch A::A(..) wäre falsch, da ein neues Objekt erzeugt wird.

    Um nochmal den Sachverhalt klar zu machen:

    class A {
    public:
    int* m_a;
    A(int n) { m_a = new int[n]; }
    A(int n, int m) {
    this->A(n*m); //Funzt leider nicht..
    }
    };

    Danke! conman



  • Das geht nicht.
    Du könntest eine init()-Methode machen die du dann in jedem Konstruktor aufrufst.



  • Mmmm... fürchte ich langsam auch, Danke!

    Übrigens coole Fusszeile! Wie hast du das gemacht, die Ausgabeschleife in eine so kryptische Form zu bringen - try&error wohl kaum, oder?



  • class A {
    public:
    	int* m_a;
    	A(int n)
    	{
    		cout << "A(int n)" << endl;
    		m_a = new int[n];
    	}
    	A(int n, int m)
    	{
    		cout << "A(int n, int m)" << endl;
    		this->A::A(n*m);
    	}
    	~A()
    	{
    		cout << "~A()" << endl;
    		delete[] m_a;
    	}
    };
    

    Vielleciht geht's auch mit Funktionszeigern, das hab ich jetzt aber nicht ausprobiert 😉



  • this->A()
    legt ein temporaeres objekt an

    nicht gerade das, was du willst, oder?



  • Shade Of Mine schrieb:

    this->A()
    legt ein temporaeres objekt an

    echt?



  • Es gibt keinen Standardkontruktor, also wird this->A() hächstens nen Fehler liefern, aber allgemein hätte ich jetzt auch darauf getippt, das es ein temporäres Objekt erzeugt. Was macht es denn sonst, Volkrad (, vorausgesetzt es gäbe einen entsprechenden Standardkonstruktor.)



  • Shade Of Mine schrieb:

    this->A()
    legt ein temporaeres objekt an

    nicht gerade das, was du willst, oder?

    Ne. Das ist ein Syntaxfehler. In C++ kann man weder Konstruktoren explizit aufrufen, noch ihre Adresse ermitteln.

    Nimm das this weg und du hast recht.

    Also das:

    this->A::A(n*m);
    

    ist kein C++.
    Und das:

    A(n*m);
    

    würde ein temporäres Objekt anlegen.



  • HumeSikkins schrieb:

    Also das:

    this->A::A(n*m);
    

    ist kein C++.

    nein? Hat mir da jetzt mein Compiler (VC6) einen Steich gespielt? Oder regt sich wieder jemand über dieses komische this-> auf?



  • tag schrieb:

    nein? Hat mir da jetzt mein Compiler (VC6) einen Steich gespielt? Oder regt sich wieder jemand über dieses komische this-> auf?

    wenn Hume sagt "das ist kein C++", dann kannst du davon ausgehen, dass es kein C++ ist.



  • Hat mir da jetzt mein Compiler (VC6) einen Steich gespielt?

    Sicher nicht mit Absicht. Das er es übersetzt ist aber in der Tat ein Fehlverhalten. Das Ergebnis ist übrigens das, was Shade geschrieben hat. Es wird ein temporäres Objekt erzeugt.



  • Hmm, na gut, hab eben nochmal ein paar Dokus durchwühlt, scheint wohl echt verboten zu sein 💡

    HumeSikkins schrieb:

    Das Ergebnis ist übrigens das, was Shade geschrieben hat. Es wird ein temporäres Objekt erzeugt.

    Da sagt mein call-stack aber was anderes 😉 Aber da es sowieso kein "richtiges" c++ ist, spielt das ja eigentlich auch keine Rolle 😉



  • Du kannst ja ein

    m_a = A(m*n).m_a;
    

    verwenden. 😉



  • Da sagt mein call-stack aber was anderes

    Oh. In der Tat. Der VC ruft hier wirklich einen weiteren Ctor für das Objekt auf. Das macht dann zwei Konstruktor bei nur einem Destruktor-Aufruf und damit auch noch eine klare Verletzung des Objekt-Lebenszyklus-Modells von C++.
    Damit lassen sich ja mal lustige Resourcen-Löcher basteln.

    Das ist ja mal ein Bug der richtigen bösen Sorte.



  • HumeSikkins schrieb:

    Das macht dann zwei Konstruktor bei nur einem Destruktor-Aufruf

    Och, das macht doch nichts. Den fehlenden Destruktoraufruf kannst Du mit

    struct X { virtual ~X(){} };
    delete[] new X[0];
    

    wieder "ausgleichen" 😉 🤡


Anmelden zum Antworten