Pregunta

En C ++ que tiene una referencia a un objeto que se quiere señalar de nuevo a su propietario, pero no puedo fijar el puntero durante la construcción que contiene la clase porque no es hecho construir. Así que estoy tratando de hacer algo como esto:

class A {
   public:

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

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

¿Hay una manera de garantizar B siempre se inicia con una A * sin A la celebración de un puntero a B?

Gracias

¿Fue útil?

Solución

Prueba esto:

class A;

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

private:
  A* a;
};

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

private:
  B b;

};

Desde B está contenido completamente en A, se debe declarar primero. Se necesita un puntero a una, así que tienes que con visión de declarar una antes de declarar B.

Este código se compila bajo versiones más o menos corriente de g ++.

Otros consejos

  

En C ++ tengo una referencia a un objeto que se quiere señalar de nuevo a su propietario, pero no puedo fijar el puntero durante la construcción que contiene la clase porque no es hacer la construcción.

Puede almacenar el puntero del bien.

Lo que no se puede hacer es tratar de llegar a los miembros / métodos de A través del puntero en el constructor de B, ya que la instancia principal podría no estar totalmente inicializado en el punto:

#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;
}

Si se va a cambiar alrededor de los miembros de Y, por lo que se obtendría n inicializa por primera vez, el constructor de X imprimiría 42, pero que es demasiado frágil como para confiar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top