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.

Foi útil?

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

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.

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