Sto cercando di fare della class A un amico di class B.
class B; class A{ public: void show(const B&); // ##1## but this one works fine B ob;// error incomplete type }; class B{ public: int b; B():b(1){} friend class A; };
quindi la mia domanda perché è di tipo incompleto? Ho pensato che quando ho fatto la class B
è come un prototipo di una funzione che dice alla compilazione che c’è una definizione da qualche parte nel codice.
anche nel codice sopra a ## 1 ## perché questo è ansible?
No, è una dichiarazione anticipata e non definisce un tipo completo. Avrai bisogno di avere una definizione completa di B
prima di A
, se vuoi mantenere il membro come un object e non come un puntatore.
Una delle ragioni di ciò è che la dimensione della class B
deve essere nota come A
, poiché la dimensione di A dipende da B
Ti suggerisco #include "Bh"
in Ah
.
MODIFICA: chiarimento:
struct A; struct B { A foo(); void foo(A); void foo(A&); void foo(A*); A* _a; A& __a; A a; // <--- only error here };