fonction membre ami en C ++ – la déclaration de transfert ne fonctionne pas

Je rencontre une situation similaire à celle décrite dans Spécifier une fonction d’élément de classe en tant qu’ami d’une autre classe? .

Cependant, dans mon cas, la classe B doit connaître la classe A car elle l’utilise, donc la solution donnée dans ce fil de discussion ne fonctionne pas pour moi. J’ai essayé de donner également une déclaration à la fonction elle-même mais cela n’a pas fonctionné aussi bien. Il semble que chaque classe a besoin de la définition complète de l’autre …

Y a-t-il un moyen facile de le résoudre? Je préfère une solution qui n’implique pas de nouvelles classes qui envelopperait une des anciennes classes.

exemple de code:

//Ah class B; //not helping void B::fB(); //not helping class A { public: friend void B::fB(); void fA(){}; protected: void fA_protected(){}; }; //Bh #include "Ah" class B { private: A a; public: void fB(){ a.fA_protected();} // this function should call the protected function void fB2(){ a.fA(); } }; 

Merci pour les aides!

(Au fait, c’est ma première question, j’espère pouvoir m’expliquer clairement)

    Si vous pouvez changer B pour prendre un pointeur sur A, voici ce qui pourrait vous aider: (J’utilise un pointeur brut car vous ne pouvez pas utiliser le pointeur intelligent en fonction d’un commentaire).

     //Ah #include "Bh" class A { public: friend void B::fB(); void fA() {}; protected: void fA_protected(){}; }; //Bh class A; // forward declaration class B { private: A* a; public: B(); ~B(); // rule of 3 B(const B& b); // rule of 3 B& operator = (const B&); // rule of 3 void fB(); // this function should call the protected function void fB2(); }; //B.cpp #include "Bh" #include "Ah" B::B() : a(new A) {} B::~B() { delete a; } // rule of 3 B::B(const B& b) : a(new A(*ba)) {} // rule of 3 B& B::operator = (const B&) { *a = *ba; return *this; } // rule of 3 void B::fB() { a->fA_protected();} void B::fB2() { a->fA(); }