2013-05-29 29 views
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(); 
}; 

我也有一个功能多人,其中我尝试tu使用带参数的构造函数:

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' 
+0

那么,你不能访问类'Gracz'中声明的私有成员'znak_gracza'。它是私人的。 –

+0

这个拼图的缺失部分可能是'类'成员是'私人',当没有另外声明时,就像'char znak_gracza'的情况那样' –

+0

'znak_gracza'是私人成员,因此它在派生类中不可访问 –

回答

1

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

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

};

5

private成员访问只适用于类的成员和朋友。你正在寻找它来声明char znak_graczaprotected,所以继承Gracz的类也可以访问该成员。

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

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

委托给基础构造函数不是更好吗? –

0

multiplayer功能是Gracz类的朋友,但Osoba类不是。

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

5

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

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