c++ - 存储在向量中的对象,它们何时被销毁?
问题描述
开发一个小型角色扮演游戏战斗系统来练习面向对象的代码。我有一个 Party 类,它有一个向量来存储可变数量的党员。
初始化我的派对并添加成员似乎效果很好。我什至可以调用成员的 take_damage() 函数来更改成员的 hp,这似乎也有效。
但是当我使用 hp getter 在下一行检查同一个成员的 hp 时,它就回到了它开始的地方。
我为成员类创建了一个析构函数,以查看发生了什么,并且根据输出,该对象被多次销毁。为什么是这样?
class Member
{
private:
int hp;
public:
Member() { hp = 1; }
~Member() { std::cout << "DESTROYED!!" << std::endl; }
int get_hp() { return hp; }
void take_damage(int amt) { hp += amt }
};
class Party {
private:
std::vector<Member> members;
public:
void add_member(Member memb) { members.push_back(memb); }
Member get_member(int num) { return members[num]; }
};
int main() {
Party p;
Member m;
p.add_member(m);
std::cout << p.get_member(0).get_hp() << std::endl;
p.get_member(0).take_damage(4);
std::cout << p.get_member(0).get_hp() << std::endl;
}
解决方案
您的 get_member 方法返回数组元素的副本,而不是对它的引用。返回一个引用,该成员将被修改。
Member& get_member(int num) { return members[num]; }
推荐阅读
- java - Android Gradle 5.0 更新:原因:org.jetbrains.plugins.gradle.tooling.util
- ios - IOS Universal Links 或 URL Scheme 在应用程序之间共享信息
- java - 如何为我想在 java 中调用的这个 MySQL 查询创建存储过程
- javascript - 如何在不“切换”电子应用程序的情况下将窗口放在前面?
- catia - 您如何测量最大尺寸?
- search - Solr 7.5 节点添加事件行为
- python - Jupyter notebook 中的 IPython:回忆之前的命令
- python - 在python中替换部分字符串
- web2py - 为什么我的 CSV 导出未将表示应用于引用的字段
- c# - 通过模式 C# 重命名文件夹中具有文件名的所有类 - 需要重命名类、文件和引用