2010-08-09 142 views
5
//Using g++ and ubuntu. 
#include <vector> 
using namespace std; 

定义一个类:C++有构造函数的类向量

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. 

我想要构造不同的向量的不同元素,所以我不想使用“重复序列构造函数”。 应该做什么?

回答

4

为什么在不需要创建动态内存时使用new?当然,使用new将会失败,当push_back接受foo时,会导致foo*。 (这就是你的一个载体,毕竟。)

这有什么错push_back?如果您想预先保留内存,请使用reserve();在vector的构造函数中提供一个数字使第二个参数(隐含地为foo(),这将不起作用,因此您的错误)的许多副本,这不同于简单地保留内存。

如果正确处理(没有new)崩溃,故障在您的代码中,而不是向量。你可能还没有写,管理资源的适当类。*(记住The Big Three,使用copy-and-swap idiom

*我这样说是因为你说“//arrays whose length depend upon arg1 and arg2 ”,我怀疑意味着你在你们班有new[]某处。没有三巨头,你的资源管理就会失败。

反正你不应该管理资源,班级有一个责任。这意味着它应该是一个动态数组,或者使用一个动态数组,但不能同时管理和使用一个动态数组。所以把这些资源分解到他们自己的班级中,然后制作另一个使用它们的班级(你的)。动态数组是std::vector,所以你已经完成了。 任何时间你需要一个动态数组,使用vector;没有理由不这样做。

+0

+1的一个很好的答案。如果可以的话,我想给出额外的+1,因为不是说你应该总是使用std :: vector,但是你应该总是使用vector。 – Simon 2010-08-09 06:23:57

0

的std ::向量总是创建基于默认的构造函数,你有没有在片段定义上述元素。

由于您没有处理复制构造函数,push_back方法面临着双重问题。

4
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 *。此外,更改为vector<foo *>也会失败,除非您在清除向量之前手动将每个成员delete。如果你真的想去动态内存分配路线创建一个vector< shared_ptr<foo> >shared_ptr可用于Boost libraries,或者如果您的编译器包含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 
+0

可能应该提及的是,shared_ptr是boost库或C++的一部分0x – 2010-08-09 02:52:20

+0

这是行不通的,但我需要有大3. – 2010-08-09 03:05:39

+0

@Kevin:我怀疑你应该使用'std :: vector'你没有。要把资源从使用中分解出来,不要两者兼而有之。 – GManNickG 2010-08-09 03:07:47