繁体   English   中英

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

[英]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_ptrBoost库中可用,或者如果您的编译器包含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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM