Pregunta

¿Hay alguna forma de declarar un objeto de una clase antes de crear la clase en C++?Lo pregunto porque estoy tratando de usar dos clases, la primera necesita tener una instancia de la segunda clase dentro de ella, pero la segunda clase también contiene una instancia de la primera clase.Me doy cuenta de que puedes pensar que podría entrar en un bucle infinito, pero en realidad necesito crear una instancia de la segunda clase antes de la primera clase.

¿Fue útil?

Solución

No puedes hacer algo como esto:

class A {
    B b;
};
class B {
    A a;
};

El problema más obvio es que el compilador no sabe qué tamaño necesita para crear la clase A, ¡porque el tamaño de B depende del tamaño de A!

Sin embargo, puedes hacer esto:

class B; // this is a "forward declaration"
class A {
    B *b;
};
class B {
    A a;
};

Declarar la clase B como una declaración directa le permite usar punteros (y referencias) a esa clase sin tener aún la definición completa de la clase.

Otros consejos

No puedes declarar una instancia de una clase indefinida pero puedes declarar una puntero a uno:

class A;  // Declare that we have a class A without defining it yet.

class B
{
public:
    A *itemA;
};

class A
{
public:
    B *itemB;
};

hay una solución elegante utilizando plantillas.

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 funcionará!Entonces, ¿por qué funciona?La razón tiene que ver con cómo se compilan las plantillas.Las plantillas retrasan la creación de firmas de función hasta que realmente use la plantilla en alguna parte.Esto significa que ni geta () ni getB () tendrán sus firmas analizadas hasta después de que ambas clases A y B ya se hayan sido declaradas por completo.Esa es la magia de este método.

¿Está esto cerca de lo que quieres?¿La primera clase contiene la segunda clase, pero la segunda clase (que se creará primero) solo tiene una referencia a la primera clase?

Esto se llama referencia cruzada.Ver aquí un ejemplo.

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