[Erledigt] Konstruktor aus dem Konstruktor aufrufen



  • Hallo Leute,

    kann man aus einem Konstruktor einen anderen aufrufen der die "Vorarbeit" leisten soll?

    Wie hier in Zeile 12,27,28:

    Topoobject::Topoobject(){
    
    	this->id = 0;
    	this->color = propdefault.color;
    	this->size = propdefault.size;
    	this->code = propdefault.code;
    	this->comment = propdefault.comment;
    }
    
    Topoobject::Topoobject(puint new_id){
    
    	Topoobject();
    	this->id = new_id;
    }
    
    Topoobject::Topoobject(topoproperty new_property){
    
    	this->color = new_property.color;
    	this->size = new_property.size;
    	this->code = new_property.code;
    	this->comment = new_property.comment;
    
    }
    
    Topoobject::Topoobject(puint new_id,topoproperty new_property){
    
    	Topoobject(new_id);
    	Topoobject(new_property);
    }
    


  • darkfate schrieb:

    kann man aus einem Konstruktor einen anderen aufrufen der die "Vorarbeit" leisten soll?

    Nein, erst in C++0x
    Schau dir übrigens mal Initialisierungslisten an im Buch/Tutorial deiner Wahl.



  • pumuckl schrieb:

    darkfate schrieb:

    kann man aus einem Konstruktor einen anderen aufrufen der die "Vorarbeit" leisten soll?

    Nein, erst in C++0x
    Schau dir übrigens mal Initialisierungslisten an im Buch/Tutorial deiner Wahl.

    VS2010 hat doch den diesen Standard?!

    Klappt irgendwie nicht.

    1>error C2082: redefinition of formal parameter 'new_id'
    1>error C2082: redefinition of formal parameter 'new_property'
    


  • VS2010 hat doch den diesen Standard?!

    Nein hat es nicht. TR1 ist zum Teil schon implementiert (natürlich nur Library Dinge).

    Simon



  • Wie ruft man sonst den Konstruktor des Elternobjektes auf, man kann ja nicht jedes mal den Konstruktor neu schreiben?



  • Wie rufe ich jetzt aus einer Topoknot Klasse den Topoobject Konstruktor auf?

    class Coordpair : public Topoobject{
    
    	private:
    		Coord first,second;
    
    public:
    		Coordpair();
    		Coordpair(Coord first, Coord second);
    
    		Coord get_first();
    		Coord get_second();
    
    		void set_first(Coord new_first);
    		void set_second(Coord new_second);
    
    };
    
    class Topoknot : public Coordpair{
    
    	private:
    		Coord third;
    
    	public:
    		Topoknot();
    		Topoknot(puint id);
    		Topoknot(puint new_id,Coord first,Coord second,Coord third);
    		Coord get_third();
    		void set_third(Coord new_third);
    };
    

    Wenn ich:

    Topoknot::Topoknot():Topoobject(propknot) { }
    Topoknot::Topoknot(puint new_id):Topoobject(new_id,propknot) {}
    Topoknot::Topoknot(puint new_id,Coord first,Coord second,Coord third):Topoobject(new_id,propknot){ }
    

    Dann bekokmme ich folgenden Fehler:

    1>error C2614: 'Topoknot' : illegal member initialization: 'Topoobject' is not a base or member
    

    Ich erbe doch indirekt über die Klasse Coordpair die Basisklasse Topoobject ab oder nicht?



  • Du kannst nur den Konstruktor der direkten Basisklasse aufrufen. Bei dir also Coordpair



  • Hallo,

    vieleicht hilft dir das:

    // call contructor  explizied without memory allocate (placement new)
    new ( this ) T ();
    

    Wobei T der name der Klasse ist.

    Gruß Frank



  • Frank Erdorf schrieb:

    Hallo,vieleicht hilft dir das:

    // call contructor  explizied without memory allocate (placement new)
    new ( this ) T ();
    

    Wobei T der name der Klasse ist.

    Gruß Frank

    Danke.

    Vielleicht kann mal einer sagen ob das funktioniert?
    Ich habe es im Moment schon alles umgeschrieben. Wenn es funktionieren sollte, werde ich es nätürlich ändern. Bin mal gespannt.



  • Frank Erdorf schrieb:

    vieleicht hilft dir das:

    // call contructor  explizied without memory allocate (placement new)
    new ( this ) T ();
    

    Placement New hat nichts mit dem Weiterreichen von Konstruktoren zu tun, sondern mit der Konstruktion von Objekten in uninitialisiertem Speicher. Es innerhalb eines Konstruktors auf das eigene Objekt anzuwenden führt zu undefiniertem Verhalten, weil das Objekt zwei Mal konstruiert wird.



  • Dann hat sich das ganze erledigt.
    Danke an die Antwortenden.



  • theta schrieb:

    VS2010 hat doch den diesen Standard?!

    Nein hat es nicht. TR1 ist zum Teil schon implementiert (natürlich nur Library Dinge).

    Beide nicht ganz richtig, VS2010 setzt durchaus schon kleine Teile vom C++0x um, aber bei weiten nicht vollständig (Beispiel: Schlüsselwort auto).



  • Wie siehts mit GCC aus?



  • darkfate schrieb:

    Wie siehts mit GCC aus?

    Google nach "gcc c++0x" gibt dir ziemlich genau das
    http://gcc.gnu.org/projects/cxx0x.html
    😉



  • darkfate schrieb:

    Wie siehts mit GCC aus?

    use the fucking google
    Siehe http://gcc.gnu.org/projects/cxx0x.html unter "delegating constructors"


Log in to reply