【问题标题】:How to access info from an instance from another instance in c++?如何从 C++ 中的另一个实例访问一个实例的信息?
【发布时间】:2016-01-04 09:14:12
【问题描述】:

我刚刚开始学习 OOP 概念,为了帮助自己学习,我创建了一个 Characters 类。从这个类中,我创建了一个名为 main 的实例和一个名为 monster 的实例。这是该类的代码:

#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 点生命值。

我该怎么做?

【问题讨论】:

  • 如果您不将int 而是Character&amp;(对字符的引用)传递给attack,它应该会更好。
  • 只是注意到你试图让你的attack 函数返回一个int 值,因为attack 已被声明为void 函数(即它没有'不返回值)。有一些关于函数参数和返回类型here 的阅读可能会有所帮助。

标签: c++ oop object instance


【解决方案1】:

您只需要在攻击方法中传递 Character 的引用即可。 我认为您必须了解按值传递和按引用传递的概念。如果没有,你可以阅读它here

void attack(Character &whatInstanceToAttack)  {

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

}

【讨论】:

  • 谢谢我让它工作了!事实上,我今天也阅读了指针和引用,所以我可能应该自己考虑一下。非常感谢您的帮助!
【解决方案2】:

是的,您可以从同一类的另一个实例访问一个实例的变量。您需要使用对对象的引用来确保更改反映在另一个实例中。所以你的攻击函数应该是这样的。

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

现在当你从 main() 函数调用 main.attack(monster) 时,monster 的 hitpoints 将减少 20。

附带说明,将类的数据成员设为私有被认为是一种很好的做法,以避免非法访问/修改数据。始终将成员函数用作类实例的接口。

【讨论】:

  • 感谢您的意见。另外对于旁注,我将如何访问变量。例如。我是否必须创建一个函数来返回私有变量?
  • 是的,您可以使用公共成员函数来获取和设置私有数据成员的值。这样,您始终可以验证数据成员的使用情况。例如。假设你的名字不应该为空,那么这可以在 set 函数中进行验证。
  • 好的,我会在以后的情况下记住这一点。我设置属性的方式(函数 setAttr)是最好的方式吗?
  • 嗯,可以接受,但更好的做法是使用class constructor
  • 好的,感谢所有帮助,非常感谢!
【解决方案3】:

重载方法攻击,您可以根据需要通过值或引用传递。

虚空攻击(字符chr) 要么 虚空攻击(字符 &chr)

【讨论】:

  • void attack(Character chr) 不起作用。关键是更改实例中的值。所以按值调用没有任何意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
相关资源
最近更新 更多