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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top