C ++对象向量

时间:2018-07-09 09:41:48

标签: c++ vector

我相对较不熟悉创建对象向量。以下是我的对象在使用之前包含保持向量的代码:

class obj {
public:
    int* arr;
    obj(int x) {
        arr = new int[x];
    }
    ~obj() {
        delete[] arr;
    }
    // All functionality stripped for clarity
};

我现在想创建一个向量来容纳所有创建的obj。我尝试过的是创建一个矢量,然后将新创建的对象推入它,类似于以下内容:

std::vector<obj> objVector;
objVector.push_back(obj(5));
objVector.push_back(obj(8));

以上内容会导致未创建arr且为空指针的错误。我在本网站上其他地方看到的建议是包括一个副本创建者以方便使用。所以我有以下问题:

  • 使用上面的push_back代码将创建2个对象(一个临时对象和一个矢量对象),或者直接在矢量中创建一个对象。
  • 我必须在副本创建者中包括什么?我是否必须为第二个对象创建一个新的arr还是可以将其传递给第二个对象?

如果这是实现对象持有人的一种较差的方法,那么请您指出一个我可以阅读的信息源。


大家好,我必须对其进行编辑,因为它被标记为重复项。请注意,我知道三分之五的规则,并暗示我需要在上面加上这一点。我真正要问的问题是向量如何处理和推入物体。

是否创建一个临时对象并运行它的构造函数,然后将该临时对象的副本复制到向量中。或者相反,它会直接将对象创建到向量中。

也如下所述,将对象包含在向量中似乎将避免使用复制函数,因为它似乎直接创建了对象。我知道我仍然需要实施规则,我只是想了解标准化代码的作用以及它的工作原理。

1 个答案:

答案 0 :(得分:1)

您需要copy/move constructor并保留数组的大小。参见著名的Rule of 3/5

class obj {
public:
    int* arr;
    const size_t size;
    obj(const obj& other)
        :size(other.size)
    {
        arr = new int[size];
        std::copy(other.arr,other.arr+size,arr);
    }
    obj& operator=(const obj&) = delete; // unclear what to do if size!=other.size
    obj& operator=(obj&&) = delete; // unclear what to do if size!=other.size
    obj(obj&& other)
        :size(other.size)
    {
        arr = other.arr;
        other.arr=nullptr;
    }
    obj(size_t x) 
        :size(x)
    {
        assert(x>0);
        arr = new int[x];
    }
    ~obj() {
        if(arr)
            delete[] arr;
    }
    // All functionality stripped for clarity
};

P.S。 无需对智能指针如此教条。他们帮助了我们,但没有他们,我们生存了30年。