稍后通过调用Class构造函数创建std :: vector <class>

时间:2019-05-22 17:45:26

标签: c++ stdvector

我一直在谷歌搜索和堆栈溢出这个问题,但是找不到任何答案。

我想做的事情是创建一个带有自定义类的向量,我没有问题。我知道我需要这样做:

std::vector<ExtClass> varName;

但是,我要做的是:

由于varName现在是ExtClass类型,所以我想在另一个类中调用它的构造函数。需要澄清的是,我认为代码将对此做出最好的解释:

class ExtClass {
    public:
        int ext;
        int pet;

    ExtClass();
};

ExtClass:ExtClass() {
    this->ext = std::rand();
    this->pet = std::rand();
}

________________________

class MainClass {
    public:
        std::vector<ExtClass> attribute;

    MainClass(int);
}

MainClass(int size) {
    this->attribute.reserve(size) // reserving enough places in vector
    for (int i = 0; i < size; ++i)
        this->attribute[i] = new ExtClass(); // problem
}

我已使用所有公共成员来避免不必要的代码。

我以为std :: vector属性是ExtClass元素的向量,并且由于尚未定义,因此我可以将向量的每个元素分配为:

new ExtClass()

会创建,例如:

attribute[0].ext = 5125;
attribute[0].pet = 151;

绝对不是这种情况,编译器对此表示反对:

note: candidate: constexpr ExtClass& ExtClass::operator=(const ExtClass&)
class ExtClass {
      ^~~~~~
note:   no known conversion for argument 1 from ‘ExtClass*’ to ‘const ExtClass&’
note: candidate: constexpr ExtClass& ExtClass::operator=(ExtClass&&)
note:   no known conversion for argument 1 from ‘ExtClass*’ to ‘ExtClass&&’

我不是C ++专家,但是相对较新,我正在练习。你能告诉我我的错误是什么吗?我做错了什么假设?

谢谢!

2 个答案:

答案 0 :(得分:3)

可以通过以下方式固定编写的代码:

MainClass(int size) 
   : attribute( size )
{
}

就是这样,它将使用attribute的默认构造对象size初始化ExtClass

请注意此代码:

this->attribute.reserve(size) // reserving enough places in vector
for (int i = 0; i < size; ++i)
    this->attribute[i] = new ExtClass(); // problem

即使我们将其修复为可编译的

this->attribute.reserve(size) // reserving enough places in vector
for (int i = 0; i < size; ++i)
    this->attribute[i] = ExtClass(); // problem

当您尝试访问空向量的元素时会导致UB-调用储备金不会更改向量拥有的对象数量,只会更改将来使用的容量。

答案 1 :(得分:2)

如上面的注释所示,您可以替换:

for (int i = 0; i < size; ++i)
    this->attribute[i] = new ExtClass();

具有:

for (int i = 0; i < size; ++i)
    this->attribute.emplace_back ();

您的向量将为您管理ExtClass对象的生存期。