Declare um objeto antes mesmo que a classe é criada
-
02-07-2019 - |
Pergunta
Existe uma maneira de declarar um objeto de uma classe antes da classe é criada em C ++? Eu pergunto porque eu estou tentando usar duas classes, as primeiras necessidades para ter uma instância de segunda classe dentro dele, mas a segunda classe também contém uma instância da primeira classe. Sei que você pode pensar que eu poderia entrar em um loop infinito, mas eu realmente preciso para criar e instância da segunda classe antes da primeira classe.
Solução
Você não pode fazer algo como isto:
class A {
B b;
};
class B {
A a;
};
O problema mais óbvio é o compilador não sabe como grande ele precisa fazer classe A, porque o tamanho do B depende do tamanho da A!
Você pode, no entanto, fazer isso:
class B; // this is a "forward declaration"
class A {
B *b;
};
class B {
A a;
};
Declarando classe B como uma declaração para a frente permite a utilização de ponteiros (e referências) para essa classe sem ter ainda toda a definição de classe.
Outras dicas
Você não pode declarar uma instância de uma classe indefinida, mas você pode declarar um ponteiro para um:
class A; // Declare that we have a class A without defining it yet.
class B
{
public:
A *itemA;
};
class A
{
public:
B *itemB;
};
Há uma solução elegante usando templates.
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(); }
Este código vai funcionar! Então, por que faz isso trabalhos? A razão tem a ver com a forma como modelos são compilados. Modelos atrasar a criação da função assinaturas até que você realmente usam o em algum lugar modelo. Isso significa que nem Geta () nem getB () terá suas assinaturas analisados ??até depois ambas as classes A e B já foram totalmente declarado. Essa é a mágica de este método.
É este perto do que você quer:? A primeira classe contém a segunda classe, mas a segunda classe (que está a ser criado pela primeira vez) só tem uma referência para a primeira classe
Isso é chamado de referência cruzada. Consulte aqui um exemplo.