Frage

In C ++ Ich habe einen Verweis auf ein Objekt, das zurück zu seinem Besitzer zeigen will, aber ich kann nicht den Zeiger während der enthaltenden Klasse Konstruktion festgelegt, da seine Konstruktion nicht getan. Also ich versuche, so etwas zu tun:

class A {
   public:

     A() : b(this) {}
   private:
     B b;
};

class B {
   public:
     B(A* _a) : a(_a) {}
   private:
     A* a;
};

Gibt es eine Möglichkeit, um sicherzustellen, B immer mit einem A initialisiert wird * ohne A einen Zeiger hält nach B?

Danke

War es hilfreich?

Lösung

Versuchen Sie folgendes:

class A;

class B {
public:
  B(A *_a) : a(_a) {};

private:
  A* a;
};

class A {
public:
  A() : b(this) {};

private:
  B b;

};

Da B vollständig in A enthalten ist, muss sie zuerst deklariert werden. Es braucht einen Zeiger auf A, so müssen Sie voraus declare A, bevor Sie B erklären.

Dieser Code kompiliert unter mehr oder weniger aktuellen Versionen von g ++.

Andere Tipps

  

In C ++ Ich habe einen Verweis auf ein Objekt, das zurück zu seinem Besitzer zeigen will, aber ich kann nicht den Zeiger während der enthaltenden Klasse Konstruktion festgelegt, da seine Konstruktion nicht getan.

Sie können den Zeiger in Ordnung speichern.

Was Sie nicht können, ist zu versuchen, die Mitglieder / Methoden von A durch den Zeiger im Konstruktor von B zu bekommen, da könnte die übergeordnete Instanz nicht vollständig an dem Punkt initialisiert werden:

#include <iostream>

class Y;

class X
{
    Y* y;
public:
    X(Y* y);
};

class Y
{
    X x;
    int n;
public:
    Y(): x(this), n(42) {}
    int get_n() const { return n; }
};

X::X(Y* p): y(p)
{
    //Now this is illegal:
    //as it is, the n member has not been initialized yet for parent
    //and hence get_n will return garbage
    std::cout << p->get_n() << '\n';
}

int main()
{
    Y y;
}

Wenn Sie rund um die Mitglieder in Y zu wechseln sind, so n zuerst initialisiert erhalten würden, würde der Konstruktor von X 42 drucken, aber das ist zu zerbrechlich auf abzuhängen.

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