首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++对象向量

C++对象向量
EN

Stack Overflow用户
提问于 2018-07-09 09:41:47
回答 1查看 423关注 0票数 0

我对于创建对象向量相对来说还是比较新的。下面是我的对象在我之前使用的代码,包括一个保持向量:

代码语言:javascript
复制
class obj {
public:
    int* arr;
    obj(int x) {
        arr = new int[x];
    }
    ~obj() {
        delete[] arr;
    }
    // All functionality stripped for clarity
};

现在我要创建一个向量来保存所有创建的objs。我尝试的是创建一个向量,然后将新创建的对象推入其中,如下所示:

代码语言:javascript
复制
std::vector<obj> objVector;
objVector.push_back(obj(5));
objVector.push_back(obj(8));

以上情况会导致没有创建arr并且是空指针的错误。我在这个网站的其他地方看到的建议是包括一个副本创建者,以方便。因此,我有以下问题:

  • 使用上述push_back代码,将创建两个对象(一个临时对象和一个向量对象),或者将一个对象直接创建到向量中。
  • 我必须在副本创建者中包含什么,我必须为第二个对象创建一个新的arr,还是可以将它传递给第二个对象。

另外,如果这是实现对象持有者的一个糟糕的方法,那么请您指出一个源代码,我可以阅读这一点。

大家好,我不得不编辑这个,因为它已经被标记为一个副本。请注意,我知道三/五的规则,并间接地知道我需要将这一点包括在上面。我在要点中的问题实际上是关于向量是如何处理和对象被推送的。

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

另外,正如下面所评论的,似乎将对象嵌入到向量中将避免复制函数的需要,因为它似乎直接创建对象。我意识到,我仍然需要实现这个规则,我只是想了解标准化代码正在做什么,以及它是如何工作的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-09 10:25:03

您需要一个复制/移动构造函数并保持数组的大小。看著名的3/5规则

代码语言:javascript
复制
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年。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51242476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档