web-dev-qa-db-fra.com

erreur: accès membre dans type incomplet: déclaration en aval de

J'ai deux classes dans le même fichier .cpp:

// forward
class B;

class A {       
   void doSomething(B * b) {
      b->add();
   }
};

class B {
   void add() {
      ...
   }
};

Le forward ne fonctionne pas, je ne peux pas compiler.

Je reçois cette erreur:

error: member access into incomplete type 'B'
note: forward declaration of 'B'

J'utilise le compilateur Clang (clang-500.2.79).

Je ne veux pas utiliser plusieurs fichiers (.cpp et .hh), j'aimerais coder uniquement sur un .cpp.

Je ne peux pas écrire la classe B avant la classe A.

Avez-vous une idée de la façon de résoudre mon problème?

35
LOLKFC

Déplacez doSomething définition en dehors de sa déclaration de classe et après B et rendez également add accessible à A par public -ing ou friend- le.

class B;

class A
{
    void doSomething(B * b);
};

class B
{
public:
    void add() {}
};

void A::doSomething(B * b)
{
    b->add();
}
27
deepmax

Vous devez avoir le définition de la classe B avant de pouvoir utiliser la classe. Sinon, comment le compilateur saurait-il qu'il existe une fonction telle que B::add?

Définissez la classe B avant la classe A ou déplacez le corps de A::doSomething après la classe B ont été définis, comme

class B;

class A
{
    B* b;

    void doSomething();
};

class B
{
    A* a;

    void add() {}
};

void A::doSomething()
{
    b->add();
}
9