向量中存储的对象何时被销毁?

时间:2019-09-10 04:16:29

标签: c++ class object vector

致力于一个小型角色扮演游戏战斗系统,以练习面向对象的代码。我有一个Party类,它有一个向量来存储可变数量的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;
}

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

请参见代码-=amt中的小问题 还改变了get_member的功能

除此之外,代码看起来还不错。

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 } // This should be -=amt, not +=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;
}