gpt4 book ai didi

c++ - 稍后调用 Class 构造函数创建 std::vector

转载 作者:行者123 更新时间:2023-11-30 01:02:19 26 4
gpt4 key购买 nike

我一直在谷歌搜索和 stackoverflowing 这个问题,但找不到任何答案。

我想做的是创建一个带有自定义类的 vector ,我对此没有问题。我明白我需要做的:

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
}

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

我想因为 std::vector 属性是一个 ExtClass 元素的 vector ,并且因为没有定义,所以我可以将 vector 的每个元素分配为:

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++ 专家,但对它比较陌生,我正在练习。你能告诉我我的错误是什么吗?我做错了什么假设?

谢谢!

最佳答案

编写的代码可以这样修复:

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

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

注意这段代码:

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

当您尝试访问空 vector 的元素时会导致 UB - 调用 reserve 不会改变 vector 持有的对象数量,只会改变 future 使用的容量。

关于c++ - 稍后调用 Class 构造函数创建 std::vector<Class>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56262313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com