[英]C++ vectors of classes with constructors
//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.
我希望矢量的不同元素的构造方式不同,所以我不想使用“重复序列构造函数”。 应该做什么?
当不需要创建动态内存时,为什么要使用new
? 当然使用new
会失败,当push_back
接受foo
时会导致foo*
。 (毕竟,这就是你的载体。)
push_back
什么push_back
? 如果要预先保留内存,请使用reserve()
; 在vector
的构造函数中提供一个数字会产生第二个参数的许多副本(这是隐式的foo()
,这将不起作用,因此你的错误),这与简单地保留内存不同。
如果正确处理(没有new
)崩溃,则错误在您的代码中,而不是向量。 您可能还没有编写适当的类来管理资源。*(请记住三巨头 ,使用复制和交换习惯用法 。)
*我这样说是因为你说“ //arrays whose length depend upon arg1 and arg2
”,我怀疑这意味着你的班级里有new[]
。 没有三巨头,您的资源管理将失败。
无论如何,你不应该管理资源,课程有一个责任。 这意味着它应该是动态数组,或者使用动态数组,但不能同时管理和使用动态数组。 因此,将资源分解到自己的类中,然后创建另一个使用它们的类(您的)。 动态数组是std::vector
,所以你已经完成了。 任何时候你需要动态数组,使用vector
; 没有理由不这样做。
vector<foo> bar(10); //error: no matching function for call to 'foo::foo()'
这是失败的,因为你正在调用的std::vector
构造函数是
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
正如您所看到的,它正在尝试使用10个对foo
的默认构造函数(不存在)的调用来填充向量。
此外,所有以new
为特色的示例都将失败,因为向量期望foo
类型的对象,而不是foo *
。 此外,除非在清除向量之前手动delete
每个成员,否则更改为vector<foo *>
也会失败。 如果你真的想去动态内存分配路由,请创建一个vector< shared_ptr< foo > >
。 shared_ptr
在Boost库中可用,或者如果您的编译器包含TR1库,它将出现在std::tr1
命名空间的<memory>
头中,或者如果您的编译器具有C ++ 0x库,它将在std
可用命名空间。
您应该做的是以下内容:
vector<foo> bar;
bar.reserve(10);
bar.push_back( foo( 1, 2 ) );
...
...
bar.push_back( foo( 10, 20 ) ); //10 times
std :: vector总是根据您在上面的代码片段中未定义的默认构造函数创建元素。
push_back方法面临双重免费问题,因为您没有处理复制构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.