我一直在谷歌搜索和堆栈溢出这个问题,但是找不到任何答案。
我想做的事情是创建一个带有自定义类的向量,我没有问题。我知道我需要这样做:
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 ++专家,但是相对较新,我正在练习。你能告诉我我的错误是什么吗?我做错了什么假设?
谢谢!
答案 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
对象的生存期。