为什么必须将在A类中声明为朋友的函数定义为B类中的公共函数?

时间:2016-08-01 16:49:39

标签: c++ class friend

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类中使用;它不应该是公开的。 有人会解释(可能有一个危险的例子)为什么朋友的功能定义不能私有?

2 个答案:

答案 0 :(得分:2)

有一个&#34;循环&#34;这里。

A中的朋友意味着声明的函数可以访问私有部分。

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

我理解你的纯洁&#34;的愿望,但C ++只是一个纯粹的&#34;语言。如果A和B密切相关并且你对它们都负有责任,而不是单独声明而疯狂,那就让彼此成为朋友。

没有人 - 他们之外 - 可以做任何危险的事情,而你已经在你自己的危险区域#34;你已经知道了...那么为什么会出现并发症?

答案 1 :(得分:0)

我接受它:

私人方法应随意更改,不会影响课堂外的影响。如果您将B的私人方法设为A的朋友,则无法更改该私有方法的签名签名,而无需更改A