为什么在 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" 中,你已经知道......那么为什么并发症?
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" 中,你已经知道......那么为什么并发症?