2010-03-01 10 views

Antwort

14

Es ist ein "Delegieren Konstruktor" genannt wird. Es ist noch nicht in der Sprache verfügbar. Aber es gibt einen formellen Vorschlag, den Sie in Anhang F.3.1 der language specification finden. Angesichts der Haltung von Microsoft gegenüber C++/CLI wird dies in absehbarer Zeit nicht der Fall sein.


UPDATE: Delegieren von Konstrukteuren ein Leben jenseits der Vorschlag in diesem Anhang hatte, wurden sie in den Standard C++ 11-Sprachspezifikation. Microsoft hat daran gearbeitet, die Ergänzungen von C++ 11 zu implementieren. Delegierende Konstruktoren haben es schließlich für VS2013 geschafft. Und sie arbeiten auch in C++/CLI in dieser Ausgabe.

1

können Sie wie folgt vorgehen

ref class A 
{ 
public: 
    A(int p) : p(p) { this->A::A(); } 
    A() : p(1) {} 

    int p; 
}; 

Es ist nicht gültig C++ Code, aber VC kompiliert es fein :)

-5

Wenn Sie sagte „Ich weiß, dass es keine Möglichkeit gibt, dies zu tun in reines C++ " Sie waren ein Fehler. Dies ist in nativem C++ möglich. Sie können dazu den Operator placement new verwenden.

class A 
{ 

public: 

    A(int p) : p(p) 
    { new(this)A(); } 

    A() : p(1) {}  

    int p; 
}; 
+1

Falsch. http://www.parashift.com/c++faq-lite/init-methods.html – user634175

+0

Das ist so falsch. – Puppy

0

Gerade gestolpert, für die gleiche Frage. In meinem Fall verwende ich VS2010.

Es ist klar, dass VS2010 nie aktualisiert werden wird, um C++ 11 vollständig zu implementieren, verwenden Sie VS2015, wenn Sie eine bessere Einhaltung des Standards benötigen (was ich tue, wenn ich kann). Aber für einige (ältere) Projekte muss ich noch VS2010 verwenden.

Ein Ansatz, der in vielen Fällen (für mich) funktioniert, ist die Verwendung einer privaten Funktion mit allen gemeinsamen Initialisierungscode darin. Beispiel:

class A 
{ 
private: 
    void Inidialise() { /* common initialisation here */ } 

public: 
    A()  { Initialise(); /* specific initialisation for A() here */ } 
    A(bool a) { Initialise(); /* specific initialisation for A(bool) here */ } 
    A(int b) { Initialise(); /* specific initialisation for A(int) here */ } 

    /* etcetera */ 

} 

Es löst nicht alle Probleme ", und es verhindert nicht, dass alle Fälle von doppeltem Code, aber es geht einem langen Weg.

Verwandte Themen