2017-05-05 117 views
-2

我有一個關於受保護變量的問題。也許我沒有真正理解他們,但不是使用它們的原因,孩子們可以使用它們嗎?總的來說,我想減少生命點。無法訪問指針的受保護的int變量父類

這裏是我的代碼: 頭文件

class Fighter { 
protected: 
    int offensePoints; 
    int defensePoints; 
    int lifepoints; 
    std::string name; 
public: 
    Fighter(const std::string n); 
    virtual ~Fighter(); 
    virtual void attackFighter(Fighter * f); 
    int randomval(int min, int max); 
    bool isalive(); 
    void isattacked(Fighter * at, int dmg); 
}; 

class Warrior : public Fighter 
{ 
public: 
    Warrior(const std::string n); 
    virtual ~Warrior(); 
    void attackFighter(Fighter * f); 
    int randomval(int min, int max); 
    bool isalive(); 
    void isattacked(Fighter * at, int dmg); 
}; 

一流的戰鬥機:

void Fighter::attackFighter(Fighter * f) 
{ 
    if (isalive()) 
    { 
     f->lifepoints -= randomval(0, offensePoints); 
    } 
} 

級戰士

void Warrior::attackFighter(Fighter * f) 
{ 
    if (isalive()) 
    { 
     f->lifepoints -= randomval(0, offensePoints); 
    } 
} 
+1

你的錯誤是什麼? –

+0

在成員Fighter :: lifepoints不能訪問「通過」「戰鬥機」 - 指針(爲我的英語sry) –

+0

它絕對是一個重複,甚至有一個解決方法可用鏈接複製http://stackoverflow.com/ a/1414851/817643 – StoryTeller

回答

-1

類似的問題在Protected data in parent class not available in child class?

的解決方案是:

void Fighter::Attacked(int offensePoints) { 
    if (isalive()) 
    { 
     lifepoints -= randomval(0, offensePoints); 
    } 
} 

在戰鬥機公共功能,並調用(也消除代碼重複)。

+1

您鏈接的問題是完全重複的,請將其標記爲一個而不是回答問題。 –

+0

這個鏈接真的沒有幫助我,但thx –

-1

你只能訪問受保護的成員在類型的實例(或從你的類型派生的)。 您無法訪問父代或表親類型實例的受保護成員。 就你而言,Derived類只能訪問Derived實例的b成員,而不能訪問其他Base實例。 更改構造函數以獲取Derived實例也將解決此問題。

Found there Accessing protected members in a derived class

這意味着在你的情況下,你不能進入戰鬥機的生命點,但只能對戰士進行。

嗯,這可以工作,但我想這不是你正在嘗試做的事:

void Warrior::attackFighter(Warrior* w)' 

另一種解決方法是調用戰鬥機的功能attackFighter勇士的內線進攻

void Warrior::attackFighter(Fighter * f) 
{ 
    Fighter::attackFighter(f); 
} 

你可以設法改變無論如何Fighter::attackFighter的行爲,例如:

void Warrior::attackFighter(Fighter * f) 
{ 
    Fighter::attackFighter(f); 
    Fighter::attackFighter(f); // This way, a warrior would attack twice when a simple fighter would only attack once. 
} 

這不是很微妙,但我相信你明白你必須避免你的問題的不同可能性。

+0

是的,我讀過之前,我該如何解決這個問題? –

+0

@DavidWalser我編輯了我的答案給你一些提示。我沒有運行這個看看它是否有效,但它應該。 – Badda