C ++向量擦除方法删除我的对象

时间:2016-10-13 00:50:28

标签: c++ c++11 vector abstract-class erase

我首先从向量中获取对象A,然后我调用erase方法来销毁向量中的对象,因为我不再需要它了。但是,从调试器中,我发现在调用erase方法之前得到的对象A也被破坏了。我不明白,因为我认为我得到的是该对象的副本,擦除方法应该与我的对象A无关。

代码

班级单位

标头文件

#ifndef UNIT_H
#define UNIT_H
#include <iostream>

class Unit
{
protected:
    int id;

public:
    Unit::Unit(int num = -1);
    virtual ~Unit() = default;
    virtual int getID();

};

#endif

CPP文件

#include "Unit.h"

Unit::Unit(int num)
{
    id = num;
}

int Unit::getID()
{
    return id;

}

Class Box

标头文件

#ifndef BOX_H
#define BOX_H
#include <string>
#include <iostream>
#include "Unit.h"

class Box : public Unit
{
private:
    std::string* type;
    int* val;
public:
    Box::Box();
    ~Box();
    int getVal();
    std::string getName();
    int getID() override;
};

    #endif

CPP文件

#include <time.h>
#include "Box.h"

Box::Box() : Unit(5)
{
    int tmp = rand() % 3;
    if (tmp == 0)
    {
        type = new std::string("hp");  // health cur
        val = new int(rand() % 10 + 1);
    }
    else if (tmp == 1)
    {
        type = new std::string("exp");  // skill level or health max
        val = new int(rand() % 5 + 1);
    }
    else
    {
        type = new std::string("punish");  // minus health cur
        val = new int(-1);
    }
}

Box::~Box()
{
    delete type;
    delete val;
}

int Box::getVal()
{
    return *val;
}

std::string Box::getName()
{
    return *type;
}

int Box::getID()
{
    return id;
}

主档

using namespace std;
int main()
{
    Box test;
    std::vector<Box> bag;
    bag.push_back(test);

    Box tmp = bag[0];

    bag.erase(bag.begin() + 0);

    cout << tmp.getVal();

    system("pause");
    return 0;
}

下面是调试器的屏幕截图,因为我没有10个声誉,我无法直接显示它。

before

after

如您所见,&#34;类型&#34;和&#34; val&#34;类Box的数据成员被修改。

1 个答案:

答案 0 :(得分:0)

从索引调用中查看此页面的返回类型

http://en.cppreference.com/w/cpp/container/vector/operator_at

我相信你可能有一个参考,而不是一个不同的对象。