Question

Est-il possible de déclarer un objet d'une classe avant que celle-ci ne soit créée en C ++? Je demande parce que j'essaie d'utiliser deux classes, la première doit contenir une instance de la deuxième classe, mais la deuxième classe contient également une instance de la première classe. Je me rends compte que vous pouvez penser que je pourrais entrer dans une boucle infinie, mais je dois en fait créer une instance de la deuxième classe avant la première.

Était-ce utile?

La solution

Vous ne pouvez pas faire quelque chose comme ça:

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

Le problème le plus évident est que le compilateur ne sait pas trop comment créer la classe A, car la taille de B dépend de la taille de A!

Vous pouvez cependant faire ceci:

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

Déclarer la classe B en tant que déclaration directe vous permet d’utiliser des pointeurs (et des références) vers cette classe sans avoir encore la définition complète de la classe.

Autres conseils

Vous ne pouvez pas déclarer une instance d'une classe non définie, mais vous pouvez déclarer un pointeur sur l'un:

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

class B
{
public:
    A *itemA;
};

class A
{
public:
    B *itemB;
};

Il existe une solution élégante utilisant modèles.

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

Ce code fonctionnera! Alors, pourquoi ça   travail? La raison a à voir avec comment   les modèles sont compilés. Modèles   retarder la création de fonction   signatures jusqu'à ce que vous utilisiez réellement le   modèle quelque part. Cela signifie que   ni getA () ni getB () n'auront   leurs signatures analysées jusqu'après   les deux classes A et B ont déjà été   entièrement déclaré. C'est la magie de   cette méthode.

Est-ce proche de ce que vous voulez: la première classe contient la deuxième classe, mais la deuxième classe (qui doit être créée en premier) a juste une référence à la première classe?

Ceci s’appelle référence croisée. Voir ici un exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top