2015-10-07 48 views
1

我剛剛開始學習OOP概念並幫助自己學習,我創建了一個Characters類。從這門課我做了一個叫做main的實例和一個叫做monster的實例。這裏是該類的代碼:如何從C++中的另一個實例訪問實例中的信息?

#include <iostream> 
#include <string> 

using namespace std; 
class Character { 

public: 
string name; 
float health; 
int attackLevel; 
int defenseLevel; 

void setAttr(string sName,float sHealth, int sAttackLevel, int sDefenseLevel) { 
    name = sName; 
    health = sHealth; 
    attackLevel = sAttackLevel; 
    defenseLevel = sDefenseLevel; 

} 



void attack(int whatInstanceToAttack) { 

    whatInstanceToAttack.hitpoints -= 20; //obviously not valid but how do i do this? 

    return whatInstanceToAttack; 
} 
int defend(string defend) { 

    int damageRelieved = defenseLevel * 2; 
    return damageRelieved; 
} 




}; 
int main() { 
Character main; 
Character monster; 
main.setAttr("Rafael",200,100,30); 
monster.setAttr("Monster1",30,40,30); 
cout << "Default Values for Raf are;" << endl; 
cout << main.name << endl; 
cout << main.health<< endl; 
cout << main.attackLevel << endl; 
cout << main.defenseLevel << endl; 


cout << "Default values for monster are" << endl; 
cout <<monster.name << endl; 
cout <<monster.health << endl; 
cout << monster.attackLevel<< endl; 
cout << monster.defenseLevel << endl; 



return 0; 
} 

基本上我想要做的就是通過主實例訪問怪物實例。我想通過運行攻擊方法來做到這一點。所以如果我運行

main.attack(monster); 

然後我想讓怪物失去20點生命值。

我該如何去做這件事?

+0

如果你不通過一個'int'而是一個'Character&'(引用一個字符)來'攻擊',它應該會更好。 –

+0

只是注意到你試圖讓你的'attack'函數返回一個'int'值,因爲'attack'已被聲明爲'void'函數(即它沒有返回值),所以這將不起作用。有一些關於函數參數和返回類型的閱讀[這裏](http://www.cplusplus.com/doc/tutorial/functions/)可能會有所幫助。 – Laserbreath

回答

1

所有你需要的是在攻擊方法通特性的參考。 我認爲你必須意識到價值傳遞和傳遞參考概念。如果沒有,你可以閱讀here

void attack(Character &whatInstanceToAttack) { 

    whatInstanceToAttack.hitpoints -= 20; //obviously not valid but how do i do this? 

} 
+0

謝謝,我得到它的工作!我今天也讀過指針和參考資料,所以我可能應該自己考慮一下。永遠感謝你的幫助! – mre12345

-1

重載方法攻擊,您可以按照您的要求傳遞值或引用。

無效攻擊(字符CHR) 或 無效攻擊(字符& CHR)

+0

'無效攻擊(Character Chr)'不起作用。重點是更改實例中的值。所以按價值調用不會有任何意義。 –

1

是的,你可以從同一類的其他實例訪問實例的變量。您需要使用對象的引用來確保更改反映在其他實例中。所以這裏是你的攻擊函數應該是什麼樣子。

void attack(Character &c) 
{ 
    c.hitpoints - = 20; 
} 

現在,當您從main()函數調用main.attack(怪物),怪物的hitpoints將得到由20

遞減作爲一個側面說明,它被認爲是一個很好的做法,使一類私人數據成員,以避免非法訪問/修改數據。始終使用成員函數作爲您的類實例的接口。

+0

感謝您的輸入。另外對於附註,我將如何訪問變量。例如。我需要做一個函數來返回私有變量嗎? – mre12345

+0

是的,您可以使用公共成員函數來獲取和設置私有數據成員的值。這樣您可以隨時驗證數據成員的使用情況。例如。假設你的名字不能爲空,那麼這可以在set函數中驗證。 –

+0

好吧我會在未來的情況下記住這一點。我設置屬性(函數setAttr)的方法是最好的方式,因爲我只是把它做好了。 – mre12345

相關問題