//Using g++ and ubuntu.
#include <vector>
using namespace std;
定义一个类:
class foo(){
(...)
foo(int arg1, double arg2);
}
构造函数:
foo::foo(int arg1, double arg2){
(...) //arrays whose length depend upon arg1 and arg2
}
我想做这样的事情:
vector<foo> bar(10); //error: no matching function for call to 'foo::foo()'
bar[0] = new foo(123, 4.56);
(...)
另一种方法(我不太喜欢)是使用 push_back:
vector<foo> bar; //works
bar.push_back(new foo(123, 4.56)); //throws similar error.
//Omitting the "new" compiles but throws a "double free or corruption (fasttop)" on runtime.
我希望以不同方式构造 vector 的不同元素,因此我不想使用“重复序列构造函数”。 应该怎么办?
最佳答案
当不需要创建动态内存时,为什么要使用 new
?当然,使用 new
会失败,当 push_back
接受 foo
时,它会导致 foo*
。 (毕竟,这就是你所拥有的 vector 。)
push_back
有什么问题?如果要预先保留内存,请使用 reserve()
;在 vector
的构造函数中提供一个数字会生成第二个参数的多个拷贝(隐含地是 foo()
,这将不起作用,因此会出现错误),这是'与简单地保留内存相同。
如果正确执行操作(没有 new
)崩溃,则错误出在您的代码中,而不是 vector 中。您可能还没有编写管理资源的适当类。*(记住 The Big Three,使用 copy-and-swap idiom。)
*我这样说是因为你说“//长度取决于 arg1 和 arg2 的数组
”,我怀疑这意味着你的类(class)某处有 new[]
。没有三巨头,你的资源管理将失败。
无论如何你都不应该管理资源,类有一个责任。这意味着它应该是动态数组,或者使用动态数组,但不能同时管理和使用动态数组。因此,将资源分解到他们自己的类中,然后创建另一个使用它们的类(你的)。动态数组是一个 std::vector
,因此您已经完成了它。 任何时候当你需要一个动态数组时,使用一个vector
;没有理由不这样做。
关于具有构造函数的类的 C++ vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3437017/