【问题标题】:Two classes friending a member function from the other class两个类与另一个类的成员函数交朋友
【发布时间】:2021-08-29 08:55:29
【问题描述】:

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

举例说明:

#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++ 允许整个类的交友,这将解决这个问题。但是,据我所知,最好的做法是尽可能限制成员的可见性。

【问题讨论】:

  • 您可能想考虑一下为什么需要这样的结构。是否可以访问其他类的私有成员?这就是为什么你有公共吸气剂。
  • 这只是我试图理解朋友的概念,尽管我同意在大多数情况下 getter 就足够了。可能存在一个类有很多成员的情况,因此与使用大量成员的函数交友比拥有多个可能仅由该一个函数使用的 getter 更方便。

标签: c++ oop cyclic-dependency


【解决方案1】:

你可以做这样的事情,虽然它可能不值得麻烦。

class B {
  friend class AccessorForAFuncA;
};

class A {
  void func_A();
};

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-19
    • 2016-02-07
    • 2016-11-26
    • 2015-11-24
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2019-02-18
    相关资源
    最近更新 更多