存储在向量中的对象,它们何时被销毁?

Posted

技术标签:

【中文标题】存储在向量中的对象,它们何时被销毁?【英文标题】:Stored objects in a vector, when are they being destroyed? 【发布时间】:2019-09-10 04:16:29 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

查看代码-=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;

【讨论】:

以上是关于存储在向量中的对象,它们何时被销毁?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 控制器何时被销毁? [复制]

Runtime API 何时销毁主 CUDA 上下文?

Bean对象的生命周期

在 UIView 生命周期中知道何时销毁视图

在 JSF 中如何以及何时销毁 @ViewScoped bean?

java中静态成员变量、实例变量、局部变量何时创建、何时销毁?