无法访问类中声明的私有成员

时间:2013-05-29 13:10:27

标签: c++ class constructor constructorargument

这是我在这里的第一个问题:) 我有点问题.. 这些是我的课程:

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'

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

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();
};

答案 2 :(得分:2)

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

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

};

答案 3 :(得分:0)

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

请记住,子类无法自动访问父类私有变量。如果您希望Osoba访问znak_gracza变量,则必须将其设为protected