Deklarieren Sie ein Objekt, noch bevor diese Klasse erstellt wird
-
02-07-2019 - |
Frage
Gibt es trotzdem ein Objekt einer Klasse zu deklarieren, bevor die Klasse in C ++ erstellt wird? Ich frage, weil ich versuche, zwei Klassen zu verwenden, die ersten Bedürfnisse innerhalb es eine Instanz der zweiten Klasse haben, aber die zweite Klasse enthält auch eine Instanz der ersten Klasse. Ich weiß, dass Sie denken, kann ich in eine Endlosschleife bekommen könnte, aber ich brauche wirklich zu schaffen und die Instanz der zweiten Klasse vor der ersten Klasse.
Lösung
Sie können nicht so etwas tun:
class A {
B b;
};
class B {
A a;
};
Das offensichtlichste Problem ist der Compiler nicht weiß, wie zu groß es braucht Klasse A zu machen, weil die Größe von B auf der Größe von A hängt!
Sie können jedoch wie folgt vorgehen:
class B; // this is a "forward declaration"
class A {
B *b;
};
class B {
A a;
};
Deklarieren der Klasse B als eine Vorwärts-Deklaration können Sie Zeiger verwenden (und Verweise) zu dieser Klasse, ohne noch die ganze Klassendefinition hat.
Andere Tipps
Sie können keine Instanz einer undefinierten Klasse deklarieren Sie können jedoch einen Zeiger , um eine deklarieren:
class A; // Declare that we have a class A without defining it yet.
class B
{
public:
A *itemA;
};
class A
{
public:
B *itemB;
};
Es gibt eine elegante Lösung mit Vorlagen.
template< int T > class BaseTemplate {}; typedef BaseTemplate< 0 > A; typedef BaseTemplate< 1 > B; // A template<> class BaseTemplate< 0 > { public: BaseTemplate() {} // A constructor B getB(); } // B template<> class BaseTemplate< 1 > { public: BaseTemplate() {} // B constructor A getA(); } inline B A::getB() { return A(); } inline A B::getA() { return B(); }
Dieser Code funktioniert! Also, warum tut es Arbeit? Der Grund hat zu tun, wie Vorlagen zusammengestellt. Vorlagen verzögern die Erzeugung von Funktions Signaturen, bis Sie tatsächlich die Verwendung Vorlage irgendwo. Das bedeutet, dass weder getA () noch getB () haben ihre Unterschrift erst nach analysiert beide Klassen A und B wurden bereits vollständig erklärt. Das ist die Magie von diese Methode.
Ist das nah an, was Sie wollen: Die erste Klasse, die zweite Klasse enthält, aber die zweite Klasse (dh zuerst erstellt werden) hat nur einen Verweis auf die erste Klasse
Dies ist Querverweis bezeichnet. Siehe hier ein Beispiel.