Kaskadierte ctor-Aufrufe?



  • Jup, den Code hatte ich meinem VC auch Mal drin und ging nich. Aber wenn es ein neues Feature ist, dann ist es eben kein altes, also wäre die Frage beantwortet, danke. 🙂



  • Eisflamme schrieb:

    Cascade(int z)
    	{
    		Cascade();
    		x += z;
    	}
    };
    

    Tut nicht das, was du denkst. Du erzeugst hier im Ctor ein temporäres (weil unbenanntes) Cascade-Objekt, das default-konstruiert wird, mit dem du nichts machst und das am Ende des Statements, also beim Semikolon, gleich wieder zersttört wird.



  • Ich bin diese Art des Aufbaus von Konstruktoren auch von C# gewohnt und musste jetzt auf Init-Funktionen zurückgreifen, ein bisschen umständlicher, aber bringt denselben Effekt.



  • Eisflamme schrieb:

    Hi,

    ich frage mich gerade, ob man in C++ ctor-Aufrufe kaskadieren kann. Ich habe das bisher irgendwie nie gebraucht, könnte es jetzt aber nutzen. Ansich kann man den ctor ja aufrufen, aber die Elementinitialisierer funktionieren dann nicht. 😞

    Nicht weiter verwunderlich ist, dass

    #include <iostream>
    
    class Cascade
    {
    private:
    	int x;
    
    public:
    	Cascade() : x(0) {}
    
    	Cascade(int z)
    	{
    		Cascade();
    		x += z;
    	}
    };
    
    int main()
    {
    	Cascade x;
    	Cascade y(10);
    }
    

    hier x den Memberwert 0 hat und y den Membertwert undefiniert+10.

    Kann ich das irgendwie lösen? Oder muss ich die Elementinitialisierer rausschmeißen? Aber wenn ich noch einen Basisklassen-ctor füttern muss, klappt das so nicht. Oder ich muss die Elementinitialisierer redundant jedes Mal neu hinschreiben und rufe halt für anderweitige Initialisierungen die anderen ctors auf. Alles nicht wirklich schön... 🙄

    Wie bereits beschrieben, ist das aktuell noch nicht möglich. Alternativ könntest du natürlich auch mit Makros etwas machen. Das ist sicher auch nicht schön, aber zumindest zweckmäßig, denke ich:

    #include <iostream>
    
    #define CASCADE_CTOR() x(0)
    
    class Cascade
    {
    private:
        int x;
    
    public:
        Cascade() : CASCADE_CTOR()
    	{
    	}
    
        Cascade(int z) : CASCADE_CTOR()
        {
    	   x += z;
        }
    };
    
    int main()
    {
        Cascade x;
        Cascade y(10);
    }
    


  • pumuckl:
    Ups. Gut, das habe ich natürlich befürchtet. Kann ich dann auch ohne Elementinitialisierer ctors überhaupt nicht verschachteln (außer über Hilfsfunktion)?



  • Eisflamme schrieb:

    pumuckl:
    Ups. Gut, das habe ich natürlich befürchtet. Kann ich dann auch ohne Elementinitialisierer ctors überhaupt nicht verschachteln (außer über Hilfsfunktion)?

    Nein, es geht (bisher) schlicht nicht.



  • Eisflamme schrieb:

    pumuckl:
    Ups. Gut, das habe ich natürlich befürchtet. Kann ich dann auch ohne Elementinitialisierer ctors überhaupt nicht verschachteln (außer über Hilfsfunktion)?

    In C++98/03 nicht. In C++0x ja. Kann allerdings bisher nur der IBM XLC 11.1 Compiler.



  • Okay, danke. 🙂 Hoffe, der Standard wird dann Mal bald released.



  • Eisflamme schrieb:

    Okay, danke. 🙂 Hoffe, der Standard wird dann Mal bald released.

    Wann der released wird ist zweitrangig (ich glaube September/Oktober ist der Plan). Wichtig ist, wann der/die Compiler deiner Wahl die entsprechenden Features unterstützen 😉



  • Dann hoffe ich, dass MSVC bald Mal den kompletten Standard reinsteckt. :p


Anmelden zum Antworten