2015-10-07 49 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

相关问题