首页 > 解决方案 > 存储在向量中的对象,它们何时被销毁?

问题描述

开发一个小型角色扮演游戏战斗系统来练习面向对象的代码。我有一个 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;
}

标签: c++classobjectvector

解决方案


您的 get_member 方法返回数组元素的副本,而不是对它的引用。返回一个引用,该成员将被修改。

Member& get_member(int num) { return members[num]; }

推荐阅读