2013-05-29 23 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 
{}