繁体   English   中英

好友功能和受保护的数据

[英]Friend function and protected data

我有课

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

我想利用这种友谊来访问mSetValue 因此,我在ScoreBoard.cpp是:我void ValueSet();定义了一个void ValueSet(); ),然后按以下方式定义它:

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

但是调试器说:

未在此范围内声明“ mSetValue”。

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

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

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

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

void ValueSet()函数中,您没有ScoreBoard任何实例。 您不能访问ScoreBoard::mSetValue不管其访问说明符或友好关系-因为它不存在。 您需要的是ScoreBoard一个实例。

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

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

根据您的评论,我怀疑成员函数比自由函数更适合您。

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

朋友功能不是该类的成员。 所以你的情况,如果你想使用mSetValueValueSet那么你必须提供一些访问mSetValue通过一个实例类或“对象”。 这可以通过将ValueSet()函数声明为

friend void ValueSet(ScoreBoard &sb);

和你的定义为

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM