C ++ referindo-se a um objecto a ser construído
-
12-09-2019 - |
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
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.