我对于创建对象向量相对来说还是比较新的。下面是我的对象在我之前使用的代码,包括一个保持向量:
class obj {
public:
int* arr;
obj(int x) {
arr = new int[x];
}
~obj() {
delete[] arr;
}
// All functionality stripped for clarity
};现在我要创建一个向量来保存所有创建的objs。我尝试的是创建一个向量,然后将新创建的对象推入其中,如下所示:
std::vector<obj> objVector;
objVector.push_back(obj(5));
objVector.push_back(obj(8));以上情况会导致没有创建arr并且是空指针的错误。我在这个网站的其他地方看到的建议是包括一个副本创建者,以方便。因此,我有以下问题:
arr,还是可以将它传递给第二个对象。另外,如果这是实现对象持有者的一个糟糕的方法,那么请您指出一个源代码,我可以阅读这一点。
大家好,我不得不编辑这个,因为它已经被标记为一个副本。请注意,我知道三/五的规则,并间接地知道我需要将这一点包括在上面。我在要点中的问题实际上是关于向量是如何处理和对象被推送的。
这是否创建了一个临时对象并运行它的构造函数,然后在向量中执行这个临时对象的副本。或者相反,它是否直接将对象创建到向量中。
另外,正如下面所评论的,似乎将对象嵌入到向量中将避免复制函数的需要,因为它似乎直接创建对象。我意识到,我仍然需要实现这个规则,我只是想了解标准化代码正在做什么,以及它是如何工作的。
发布于 2018-07-09 10:25:03
您需要一个复制/移动构造函数并保持数组的大小。看著名的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
};不需要对聪明的指点这么教条斯理。他们帮了我们的忙,但没有他们我们活了30年。
https://stackoverflow.com/questions/51242476
复制相似问题