// We want class A and B to be mutual friends of each other. // A member function in each class uses a private variable in the other. // Problematic because ma and mb are inlined in the classes: // Inside class A we use details about class B, which the compiler // is not aware of yet. #include #include class B; class A{ private: double a; public: friend class B; A(double a):a(a){} void ma(B &x){ a += x.b; // error: invalid use of incomplete type struct B } void print(){ std::cout << a << std::endl; } }; class B{ private: double b; public: friend class A; B(double b):b(b){} void mb(A &x){ b += x.a; // OK. The details of class a is known here. } void print(){ std::cout << b << std::endl; } }; int main(){ A aObj(1); B bObj(2); aObj.ma(bObj); bObj.mb(aObj); aObj.print(); // 3 bObj.print(); // 5 }