我一直在尝试找到一种方法来拥有两个类,其中每个类都有一个成员函数,每个成员函数都是另一个类的朋友。
举例说明:
#include <iostream>
class A;
class B
{
friend void A::func_A(); // compiler error: invalid use of incomplete type 'class A'
public:
void func_B() { std::cout << "Function Bn"; }
};
class A
{
friend void B::func_B();
public:
void func_A() { std::cout << "Function An"; }
};
int main()
{
A a;
B b;
a.func_A();
b.func_B();
}
我理解为什么会发生这种情况;A只被声明而没有被定义,因此B不能成为其成员函数func_A()
的朋友,因为它不知道它是什么。为了让B知道它的定义,类A的定义必须高于类B的定义。当时的问题是一样的,只是它的类A现在无法访问B的成员函数。
我的问题是,是否有办法绕过这种循环依赖关系。我知道C++允许整个类的好友关系,这将解决这个问题。然而,据我所知,最好的做法是尽可能限制成员的可见性。
您可以这样做,尽管这可能不值得麻烦。
class B {
friend class AccessorForAFuncA;
};
class A {
void func_A();
};
class AccessorForAFuncA {
private:
static void DoThingsWithPrivatePartsOf(B*);
friend void A::func_A();
};
CCD_ 2是代表CCD_ 4访问CCD_ 3的私有部分的助手类。只有A::funcA
被授予此间接访问权限。