A类是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()用于在 B类中使用;它不应该是公开的。 有人会解释(可能有一个危险的例子)为什么朋友的功能定义不能私有?
答案 0 :(得分:2)
有一个&#34;循环&#34;这里。
A中的朋友意味着声明的函数可以访问私有部分。
但要访问该声明,它必须可由A本身访问,因此B必须将A作为朋友。
我理解你的纯洁&#34;的愿望,但C ++只是一个纯粹的&#34;语言。如果A和B密切相关并且你对它们都负有责任,而不是单独声明而疯狂,那就让彼此成为朋友。
没有人 - 他们之外 - 可以做任何危险的事情,而你已经在你自己的危险区域#34;你已经知道了...那么为什么会出现并发症?
答案 1 :(得分:0)
我接受它:
私人方法应随意更改,不会影响课堂外的影响。如果您将B
的私人方法设为A
的朋友,则无法更改该私有方法的签名签名,而无需更改A
。