两个类将另一个类的成员函数作为朋友

时间:2021-06-12 22:41:12

标签: c++ oop cyclic-dependency

我一直试图找到一种方法来拥有两个类,其中每个类都有一个成员函数,每个成员函数都是另一个类的朋友。

举例说明:

#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 知道它的定义,A 类的定义必须在 B 类之上。然后问题是一样的,只是现在是 A 类无法访问 B 的成员函数。

我的问题是是否有办法解决这种循环依赖。我知道 C++ 允许将整个类添加为好友,这可以解决这个问题。但是,据我所知,最好的做法是尽可能限制成员的可见性。

1 个答案:

答案 0 :(得分:2)

你可以做这样的事情,尽管这可能不值得。

class B {
  friend class AccessorForAFuncA;
};

class A {
  void func_A();
};

class AccessorForAFuncA {
private:
  static void DoThingsWithPrivatePartsOf(B*);
  friend void A::func_A();
};

AccessorForAFuncA 是一个辅助类,它代表 B 访问 A::funcA 的私有部分。只有 A::funcA 被授予这种间接访问权限。