朋友功能和受保护的数据

时间:2016-05-31 13:49:24

标签: c++ object friend

我有课

    class ScoreBoard: public die
{ //..//
    protected:
    bool mSetValue[6];
    public:
//...//
        friend void ValueSet();
};

我希望利用这种友谊来访问mSetValue。 所以我在ScoreBoard.cpp中做的是:我预先设定一个函数(void ValueSet();),然后像这样定义:

void ValueSet()
{ char lPick;
std::cin >> lPick;
if (lPick == 1) mSetValue[0] = true; }

但是调试器说:

  

'mSetValue'未在此范围内声明。

所以,我的问题是 - 如何正确设置友谊,以便ValueSet可以访问mSetValue数组?

2 个答案:

答案 0 :(得分:1)

成员变量存在于实例(对象)中。它们也被称为“实例变量”。如果没有该类的实例,则没有实例变量。

mSetValueScoreBoard的成员变量。因此,ScoreBoard::mSetValue个实例仅存在于ScoreBoard的实例中。

  

如何正确设置友谊,以便ValueSet可以访问mSetValue数组?

在功能void ValueSet()中,您没有ScoreBoard的任何实例。您无法访问ScoreBoard::mSetValue - 无论其访问说明符还是友谊 - 因为它不存在。您需要的是ScoreBoard的实例。

  

我在ScoreBoard类中使用此函数,因此我无法在其中创建任何ScoreBoard实例

没有什么可以阻止您在ScoreBoard的成员函数中创建ScoreBoard的实例。虽然,在ScoreBoard的成员函数中,您已经可以访问由this指向的实例,因此可能不需要创建新实例。你应该做什么取决于你的意图。

鉴于你的评论,我怀疑一个成员函数更适合你,而不是一个自由函数。

为简单起见,我使用通用术语“成员变量”来引用非静态成员变量。静态成员变量是不同的。它们也被称为类变量。

答案 1 :(得分:1)

朋友职能不是班级成员。因此,如果您想在mSetValue中使用ValueSet,那么您必须通过实例或"对象"提供对mSetValue的一些访问权限。那个班。这可以通过将ValueSet()函数声明为

来完成
friend void ValueSet(ScoreBoard &sb);

你的定义为

void ValueSet(ScoreBoard &sb)
{
    char lPick;
    std::cin >> lPick;
    if (lPick == 1)
        sb.mSetValue[0] = true; 
}