Pergunta

Em C ++ Eu tenho uma referência a um objeto que quer apontar de volta para o seu dono, mas não posso definir o ponteiro durante a classe de construção contendo porque não é feito construindo. Então, eu estou tentando fazer algo como isto:

class A {
   public:

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

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

Existe uma maneira de garantir B sempre é inicializado com um A * sem Um segurando um ponteiro para B?

Graças

Foi útil?

Solução

Tente isto:

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á contida completamente em A, deve ser declarado primeiro. Ela precisa de um ponteiro para um, então você tem de transmitir-declarar um antes de declarar B.

Este código compila sob versões mais ou menos corrente de g ++.

Outras dicas

Em C ++ Eu tenho uma referência a um objeto que quer apontar de volta para o seu dono, mas não posso definir o ponteiro durante a classe de construção contendo porque não é feito construindo.

Você pode armazenar o bem ponteiro.

O que você não pode fazer é tentar chegar aos membros / métodos de A através do ponteiro no construtor de B, uma vez que a instância pai não pode ser totalmente inicializado no ponto:

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

Se você fosse para mudar em torno dos membros em Y, de modo n iria ser inicializado em primeiro lugar, o construtor da X iria imprimir 42, mas que é demasiado frágil para confiar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top