不能访问类中声明的私有成员

cannot access private member declared in class

本文关键字:成员 声明 访问 不能      更新时间:2023-10-16

这是我的第一个问题:)我有个小问题…这些是我的类:

class Gracz{
    char znak_gracza;
public:
    Gracz();
    Gracz(char znak){
            this->znak_gracza = znak;
        };
    friend void multiplayer();
};
class Osoba: public Gracz{
public:
    Osoba();
    Osoba(char znak){
            this->znak_gracza = znak;
        };
    friend void multiplayer();
};

我也有一个函数多人,我尝试使用构造函数参数:

void multiplayer(){
    Osoba gracz1('O');
    Osoba gracz2('X');
...
}

但是它不工作。

错误对于gracz1gracz2是相同的

error C2248: 'Gracz::znak_gracza' : cannot access private member declared in class 'Gracz'
see declaration of 'Gracz::znak_gracza'
see declaration of 'Gracz'

派生类不能访问父类的私有成员。您可以将它们声明为protected(类似于私有但允许派生类访问它),但在您的情况下,由于Gracz提供了一种初始化变量的方法,您应该让Osoba将参数传递给Gracz构造函数。

Osoba(char znak)
    : Gracz(znak) // initializes parent class
{}

private成员访问仅对类成员和好友可用。将char znak_gracza声明为protected,这样继承Gracz的类也可以访问该成员。

你的类Gracz应该看起来像这样:

class Gracz{
protected:
    char znak_gracza;
public:
    Gracz();
    Gracz(char znak){
            this->znak_gracza = znak;
        };
    friend void multiplayer();
};

构造函数需要将形参传递给基类构造函数:

class Osoba: public Gracz{
public:
    //...
    Osoba(char znak) :
    Gracz(znak) {
    }

};

multiplayer函数是Gracz类的友类,但Osoba类不是。

记住子类不能自动访问父类私有变量。如果你想让Osoba访问znak_gracza变量,你必须把它改成protected