带有构造函数的类的C ++向量

时间:2010-08-09 02:34:55

标签: c++ class constructor vector

//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.

我希望矢量的不同元素的构造方式不同,所以我不想使用“重复序列构造函数”。 该怎么办?

3 个答案:

答案 0 :(得分:4)

为什么在不需要创建动态内存时使用new?当然使用new会失败,当foo*接受push_back时会导致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;没有理由不去。

答案 1 :(得分: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() );

正如您所看到的,它正试图用向默认构造函数foo的10个调用来填充向量,这个构造函数不存在。

此外,所有以new为主题的示例都将失败,因为该向量需要foo类型的对象,而不是foo *。此外,除非在清除向量之前手动vector<foo *>每个成员,否则更改为delete也会失败。如果你真的想去动态内存分配路由,请创建一个vector< shared_ptr< foo > >Boost libraries中提供了shared_ptr,或者如果您的编译器包含TR1库,它将出现在<memory>命名空间中的std::tr1标头中,或者如果您的编译器具有C ++ 0x库将在std名称空间本身中可用。

您应该做的是以下内容:

vector<foo> bar;
bar.reserve(10);
bar.push_back( foo( 1, 2 ) );
...
...
bar.push_back( foo( 10, 20 ) ); //10 times

答案 2 :(得分:0)

std :: vector总是根据您在上面的代码片段中未定义的默认构造函数创建元素。

push_back方法面临双重免费问题,因为您没有处理复制构造函数。