1

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

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');
...
}

但它不起作用。

gracz1和的错误是相同的gracz2

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

4 回答 4

7

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

Osoba(char znak)
    : Gracz(znak) // initializes parent class
{}
于 2013-05-29T13:13:53.290 回答
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();
};
于 2013-05-29T13:12:25.613 回答
2

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

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

};

于 2013-05-29T13:14:47.477 回答
0

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

请记住,子类不能自动访问父类的私有变量。如果你想Osoba访问znak_gracza你必须做的变量protected

于 2013-05-29T13:13:52.843 回答