我相对较不熟悉创建对象向量。以下是我的对象在使用之前包含保持向量的代码:
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
且为空指针的错误。我在本网站上其他地方看到的建议是包括一个副本创建者以方便使用。所以我有以下问题:
arr
还是可以将其传递给第二个对象?如果这是实现对象持有人的一种较差的方法,那么请您指出一个我可以阅读的信息源。
大家好,我必须对其进行编辑,因为它被标记为重复项。请注意,我知道三分之五的规则,并暗示我需要在上面加上这一点。我真正要问的问题是向量如何处理和推入物体。
是否创建一个临时对象并运行它的构造函数,然后将该临时对象的副本复制到向量中。或者相反,它会直接将对象创建到向量中。
也如下所述,将对象包含在向量中似乎将避免使用复制函数,因为它似乎直接创建了对象。我知道我仍然需要实施规则,我只是想了解标准化代码的作用以及它的工作原理。
答案 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年。