2017-02-20 51 views
0

我正在編寫一個編程任務,我們正在學習多態。我們正在使用父母和孩子班級製作一個簡單的格鬥遊戲。我不知道如何訪問不同子類中的變量

的基本結構是這樣的:

class Parent 
{ 
protected: 
    int life; 
}; 

class Ninja : public Parent 
{ 
private: 
    Ninja (int x); 
    void ninjaAttack(); 
}; 

Ninja::Ninja (int x) : Parent() 
{ 
life = x; 
} 

Class Monster : public Parent 
{ 
private: 
    Monster(); 
    void monsterLife(); 
}; 

Monster::Monster() : Parent() 
{ 
} 

void Ninja::ninjaAttack() 
{ 
    life = (life-1); 
} 

void Monster::monsterAttack() 
{ 
cout << life << endl; 
} 

int main() 
{ 
    Ninja n1 (4); 
    Monster m2; 

    Parent * p1 = &n1; 
    Parent * p2 = &m1; 

    p1 -> ninjaAttack(); 
    p2 -> monsterAttack(); 

    return 0; 
} 

所以基本上,通過初始化一個忍者,我應該讓家長::生活= 4,對不對?然後通過運行ninjaAttack,我將「生命」降至3.然後通過調用monsterAttack,我應該輸出3,是嗎?

除了不起作用。它每次輸出零。我究竟做錯了什麼?如果我將Parent類中的變量設置爲等於Child類中的某個變量,那麼如何才能真正更改Parent類中的變量,以便可以在Child類中訪問這個新變化的變量?

謝謝!!

+1

請作出[mcve]。您的代碼由於各種不相關的原因而無法編譯,因此很難找到實際問題。 – nwp

+0

我建議你從編譯你的例子開始,編譯器是你的朋友,並會告訴你你做錯了什麼。一些提示:ninjaAttack和monsterAttack不是Parent類的方法,所以你不能在指向Parent類的指針上調用它們。 現在你的問題 - 當你打電話給ninjaAttack,你減少你稱爲方法的忍者對象的生命數 - 這不會改變不同對象的生命值 – Amnon

+0

感謝您的評論,我會讓它編譯 – FKAjasmine

回答

0

MonsterNinja是兩個不同的類別。顯示的代碼初始化兩個不同的對象。這兩個對象是完全獨立的。類的構造函數Ninja及其ninjaAttack()方法初始化並修改其中一個對象的life

monsterAttack()方法是爲了打印它life成員在第二對象上調用,但對象絕對沒有的事,無論如何,與Ninja對象,其life被減少到3 Monsterlife從未初始化,並打印其值導致未定義的行爲。 0的輸出是這種未定義行爲的一種可能結果。

+0

謝謝。所以如果我想使用兩個類都可以訪問的變量,那麼我會怎麼做?就像我想讓一個階級的攻擊減少他人的生命一樣? – FKAjasmine

+0

根據情況而定,指針或靜態類成員。 –

+0

嗨,謝謝。我仍然遇到麻煩。我這樣試了:我在父類中做了一個指針(* DM)變量。然後我在父類中做了一個int(「HP」)。然後,在一個子類中,我將指針分配給int的地址(DM =&HP)。然後,仍然在子類中,我使用間接運算符通過DM爲DM分配一個值(* DM = 123456)。問題是,當我從另一個孩子班級打電話給惠普時,它仍然顯示爲零。我很困惑!謝謝!! – FKAjasmine

-1

一些言論:

  • 聲明monsterLife但你定義monsterAttack
  • 兩個構造NinjaMonster是私有的,所以你不能把它直接

回到你的問題,我認爲你可以使用static變量。例如,

#include <iostream> 

using namespace std; 

class Parent 
{ 
protected: 
    static int life; 
}; 

int Parent::life = 0; 

class Ninja : public Parent 
{ 
public: 
    Ninja (int x); 
    void ninjaAttack(); 
}; 

Ninja::Ninja (int x) : Parent() 
{ 
    Parent::life = x; 
} 

class Monster : public Parent 
{ 
public: 
    Monster(); 
    void monsterLife(); 
}; 

Monster::Monster() : Parent() 
{ 
} 

void Ninja::ninjaAttack() 
{ 
    Parent::life = Parent::life-1; 
} 

void Monster::monsterLife() 
{ 
    cout << Parent::life << endl; 
} 

int main() 
{ 
    Ninja n1 (4); 
    Monster m2; 

    n1.ninjaAttack(); 
    m2.monsterLife(); 

    return 0; 
} 
+0

這裏的所有實例共享'生命'變量 –

相關問題