两个 class 将另一个 class 的成员函数加为好友
Two classes friending a member function from the other class
我一直在尝试找到一种方法来拥有两个 classes,其中每个 class 都有一个成员函数,并且每个成员函数都是另一个的友元 class.
举例说明:
#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 B\n"; }
};
class A
{
friend void B::func_B();
public:
void func_A() { std::cout << "Function A\n"; }
};
int main()
{
A a;
B b;
a.func_A();
b.func_B();
}
我明白为什么会这样; A 仅被声明而未定义,因此 B 不能成为其成员函数 func_A()
的好友,因为它不知道它是什么。要让 B 知道它的定义,class A 的定义必须高于 class B 的定义。那么问题是一样的,除了现在是 class A 无法访问 B 的成员函数。
我的问题是是否有解决这种循环依赖的方法。我知道 C++ 允许对整个 class 加好友,这将解决此问题。但是,据我所知,最好的做法是尽可能限制成员的可见性。
你可以做这样的事情,虽然它可能不值得麻烦。
class B {
friend class AccessorForAFuncA;
};
class A {
void func_A();
};
class AccessorForAFuncA {
private:
static void DoThingsWithPrivatePartsOf(B*);
friend void A::func_A();
};
AccessorForAFuncA
是一个助手 class,它代表 A::funcA
访问 B
的私有部分。只有 A::funcA
被授予此间接访问权限。
我一直在尝试找到一种方法来拥有两个 classes,其中每个 class 都有一个成员函数,并且每个成员函数都是另一个的友元 class.
举例说明:
#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 B\n"; }
};
class A
{
friend void B::func_B();
public:
void func_A() { std::cout << "Function A\n"; }
};
int main()
{
A a;
B b;
a.func_A();
b.func_B();
}
我明白为什么会这样; A 仅被声明而未定义,因此 B 不能成为其成员函数 func_A()
的好友,因为它不知道它是什么。要让 B 知道它的定义,class A 的定义必须高于 class B 的定义。那么问题是一样的,除了现在是 class A 无法访问 B 的成员函数。
我的问题是是否有解决这种循环依赖的方法。我知道 C++ 允许对整个 class 加好友,这将解决此问题。但是,据我所知,最好的做法是尽可能限制成员的可见性。
你可以做这样的事情,虽然它可能不值得麻烦。
class B {
friend class AccessorForAFuncA;
};
class A {
void func_A();
};
class AccessorForAFuncA {
private:
static void DoThingsWithPrivatePartsOf(B*);
friend void A::func_A();
};
AccessorForAFuncA
是一个助手 class,它代表 A::funcA
访问 B
的私有部分。只有 A::funcA
被授予此间接访问权限。