C++在给定构造函数中循环创建对象

C++在给定构造函数中循环创建对象,c++,arrays,stdvector,C++,Arrays,Stdvector,我正在创建一个在一定程度上模仿std::vector的类 我很快就遇到了一个问题,无法创建没有默认构造函数的对象数组。我在这里找到了答案,这让我可以这么做。但现在的问题是,我被一个特定的构造函数束缚住了 我如何通过像这样的构造函数 标准::矢量100,Obj1,str 是吗 或对于那些不是高级C++开发人员的人来说,这太复杂了吗?< p>我不确定你到底想要什么,但是如果你想用一些默认值初始化列表,然后使用不同的方法来构造其他的,你可以根据需要操作列表。让我进一步阐述: 假设这是您将来定义Obj的

我正在创建一个在一定程度上模仿std::vector的类

我很快就遇到了一个问题,无法创建没有默认构造函数的对象数组。我在这里找到了答案,这让我可以这么做。但现在的问题是,我被一个特定的构造函数束缚住了

我如何通过像这样的构造函数 标准::矢量100,Obj1,str 是吗


或对于那些不是高级C++开发人员的人来说,这太复杂了吗?

< p>我不确定你到底想要什么,但是如果你想用一些默认值初始化列表,然后使用不同的方法来构造其他的,你可以根据需要操作列表。让我进一步阐述:

假设这是您将来定义Obj的方式,那么将Obj的实现包括在内会很有帮助

现在vectors可以采用容量和可选的默认值。 如果您的类型没有不接受任何值的构造函数,则在不指定默认值的情况下无法创建这样的向量,因此必须通过使用所需的构造函数创建该对象的一个实例来传递默认值。您始终可以创建一个空向量,然后逐个向其中添加项。为了提高性能,如果您知道您将拥有多少项,您可以为它们保留内存点,但现在还不能添加它们。这样,您就不必担心构造函数,因为此时还不会创建任何对象。本文最后截取的代码演示了如何做到这一点。 如果有int,可以执行以下操作:

std::vector<int> myInts{50, 1};  // make a vector of 50 items with default value of 1
myInts[1] = 26;  // change the second value to be 26.
请注意,这些是副本,因此如果更改其中一个副本,则不会更改其他副本。下面的内容与上面的内容相同,但它在一行中传递的是右值而不是左值

std::vector<Obj> myObjs{50, Obj{100, "Type1"}};  // same thing as above.
现在,如果希望某些项以不同的方式构造,可以指定不同的值

std::vector<Obj> myObjs{50, Obj{100, "Type1"}};
myObjs[0] = Obj{"Type2"};
如果你有很多不同的初始化方法。然后,您可以做的是避免使用默认值创建列表,并将项目逐个添加到向量中

std::vector<Obj> myObjs;
myObjs.reserve(100);  // expand the capacity but don't actually create any items.
myObjs.push_back(Obj{10, "Type1"});
myObjs.push_back(Obj{"Type2"});

所以,您想创建100个对象,这些对象用相同的值初始化,但它们是不同的对象?您不传递构造函数,而是传递一个对象并复制它。@KamilCuk我想我是以错误的方式看待它的。。。你能告诉我在哪里可以看到如何用这种方式复制一个物体吗?当然,学习。只需使用新的Obj[100]分配内存,并使用std::fill或std::fill\n来填充一些值。std::fill只是一个赋值。嗯,我想寻找模拟向量的方法的最好地方是向量本身,谢谢你的好心先生。谢谢你的回答,但正如我说的,我正在尝试模拟向量,这意味着不使用它。那么你想创建一个OBJ数组吗?像Obj[]?在这种情况下,我建议或多或少像vector那样做,取默认值并复制它来创建数组。这实际上是我想要的。你能告诉我在哪里可以学习如何制作这样的复制品吗?当然没有复制构造函数的对象
std::vector<Obj> myObjs{50, Obj{100, "Type1"}};
myObjs[0] = Obj{"Type2"};
std::vector<Obj> myObjs;
myObjs.reserve(100);  // expand the capacity but don't actually create any items.
myObjs.push_back(Obj{10, "Type1"});
myObjs.push_back(Obj{"Type2"});