为什么在 Class A 中声明为 friend 的函数必须在 Class B 中定义为 public 函数?

Why must a function, declared as friend in Class A, be defined as a public function in Class B?

Class A 是 Class B 实例的容器。

文件A.h:

#include "B.h"

Class A
{   public:
    unique_ptr<B>                       getInstanceOfB();

    private:
    unique_ptr<map<int, shared_ptr<B>>> uptr_BInstancesMap;
    map<string, int>                    map__BUniqueValues;

    friend int                          B::getValueIndex( const string );
};

文件B.h:

Class B
{   public:
    unique_ptr<B>                       returnInstanceOfB();
//  int                                 getValueIndex( const string );  // Compiles fine

    private:
    int                                 int__ValueIndex;
    int                                 getValueIndex( const string );  // "error: 'int B::getValueIndex(std::string)' is private"
}

在 A 的实例中可能存储了超过 100,000 个 B 的实例,但是由这些 B 的实例表示的唯一值将少得多。 因此,想法是将唯一值存储在 A 的实例中,并将索引存储到 B 的每个实例中的(共享)值。 似乎是友元功能的合理方案。

getValueIndex() 用于 within Class B 但是;它不应该是 public。 有人会解释(也许有一个危险的例子)为什么 friend 函数定义不能是私有的吗?

我的看法:

私有方法应该可以随意改变,在 class 之外没有影响。如果您将 B 的私有方法设为 A 的朋友,则无法更改该私有方法的签名签名 w/o 更改 A.

这里有一个"circularity"

A中的friend表示声明的函数可以访问A的私有部分。

但是要访问该声明,A 本身必须可以访问它,因此 B 必须有 A 作为朋友。

我理解您 "purity" 的愿望,但 C++ 只是一种 "pure" 语言。如果A和B是密切相关的,并且你对他们都负责,与其疯狂地单一声明,不如让他们成为彼此的朋友。

没有人 - 除了他们 - 可以做任何危险的事情,而你已经在你自己的 "danger zone" 中,你已经知道......那么为什么并发症?