Wie andere in den Kommentaren gesagt, ist es wahrscheinlich kein Standardkonstruktor und Copy-Konstruktor für MyClass2 und Myclass. Wir sehen nicht den eigentlichen Code, aber ich denke, dass dieses Beispiel helfen würde:
class Myclass2 {
public:
Myclass2() = default;
Myclass2(int const& x) : x(x) {}
Myclass2(Myclass2 const& myclass2) : Myclass2(myclass2.x) {}
int x;
};
class Myclass{
public:
Myclass() : instance() {}
Myclass(Myclass2 const& instance) : instance(instance) {}
Myclass(Myclass const& myclass) : Myclass(myclass.instance) {}
Myclass2 instance;
};
In einigen Fällen sind die explizit erzeugt Standardkonstruktoren deaktiviert sind (wie wenn wir unsere eigenen Konstrukteure erklären, weitere Informationen http://en.cppreference.com/w/cpp/language/default_constructor), so dass wir Ich muss sie nochmal schreiben. Wir müssen Konstruktor Myclass2() : ...
so können wir zum Beispiel Myclass2 myclass;
initialisieren wie Standard Wenn alle Mitglieder der Klasse Standard konstruierbar sind, können wir lassen Sie es automatisch, indem er erklärt Myclass2() = default;
(C++ 11)
Die Linie erzeugt werden in Ihr Code this->instance = instance;
scheint etwas zu sein in der Element-Initialisierungsliste - es initialisiert Mitglieder sogar "vor" dem Konstruktor, so dass Sie konstante Mitglieder haben können, die Sie sonst nicht initialisieren könnten. Die Syntax ist:
Myclass(Myclass2 instance) : instance(instance) {
// the rest of constructor, where you can do what you want with already initialized instance
}
Sorgen Sie sich nicht um die instance(instance)
Syntax, erkennt es, was was ist (auch wenn einige Leute denken, die gleichen Namen ein wenig verwirrend sind). Auch wenn andere darauf hinweisen, dass Sie keine Myclass2-Instanz als Referenz verwenden, erstellen Sie eine temporäre Kopie und es gibt keinen Kopierkonstruktor für Myclass2.
Copy-Konstruktor (für Myclass
, die das mit Myclass const& instance
Argument nur wäre) ist das, was wir verwenden, wenn wir Klasse wie Myclass myclass(otherMyclass);
initialisieren möchten.
Es ist ziemlich üblich, Konstruktoren zum Beispiel durch Myclass(something) : Myclass() {}
zu delegieren.
(Informationen darüber, wann Sie erstellen müssen, welche davon auf http://en.cppreference.com/w/ verfügbar sind)
Manchmal auch benötigen wir Kopie Zuweisungsoperator (http://en.cppreference.com/w/cpp/language/copy_assignment) zu schaffen, so dass wir wie die Dinge tun:
Myclass m1;
Myclass m2;
m2 = m1;
aber die explizite ist wahrscheinlich genug, wenn Sie nicht unbedingt What is The Rule of Three? und What is the Rule of Four (and a half)? lesen möchten.
'Myclass :: Myclass (Myclass2-Instanz): instance (instance) {}'. Es wäre auch weniger verwirrend, wenn Sie dem Parameter einen anderen Namen als die Mitgliedsvariable geben. –
Haben Sie versucht, die Konstruktorinitialisierungsliste zu verwenden? Löst das das Problem nicht? –
Myclass :: Myclass (Myclass2 & instance, ...) kann es beheben. – lakeweb