Kev*_*lan 5 c++ constructor class vector
//Using g++ and ubuntu.
#include <vector>
using namespace std;
Run Code Online (Sandbox Code Playgroud)
定义一个类:
class foo(){
(...)
foo(int arg1, double arg2);
}
Run Code Online (Sandbox Code Playgroud)
构造函数:
foo::foo(int arg1, double arg2){
(...) //arrays whose length depend upon arg1 and arg2
}
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
vector<foo> bar(10); //error: no matching function for call to 'foo::foo()'
bar[0] = new foo(123, 4.56);
(...)
Run Code Online (Sandbox Code Playgroud)
另一种方法(我更喜欢)是使用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.
Run Code Online (Sandbox Code Playgroud)
我希望矢量的不同元素的构造方式不同,所以我不想使用"重复序列构造函数".应该做什么?
为什么new在不需要创建动态内存时使用?当然使用new会失败,它会导致 a foo*whenpush_back接受 a foo。(毕竟,这就是您拥有的向量。)
怎么了push_back?如果您想预先保留内存,请使用reserve(); 在构造函数中提供一个数字vector使第二个参数的多个副本(这是隐式的foo(),因此不会起作用,因此您的错误),这与简单地保留内存不同。
如果正确做事 (no new) 崩溃,则错误出在您的代码中,而不是向量中。您可能还没有编写管理资源的适当类。*(记住三巨头,使用复制和交换习语。)
*我这么说是因为你说“ //arrays whose length depend upon arg1 and arg2
”,我怀疑这意味着你new[]在你班上的某个地方。没有三巨头,您的资源管理将失败。
无论如何你不应该管理资源,类有一个责任。这意味着它应该是动态数组,或者使用动态数组,但不能同时管理和使用动态数组。因此,将资源分解为它们自己的类,然后创建另一个使用它们的类(您的)。动态数组是 a std::vector,所以您已经完成了。任何时候需要动态数组时,都可以使用vector; 从来没有理由不这样做。
vector<foo> bar(10); //error: no matching function for call to 'foo::foo()'
Run Code Online (Sandbox Code Playgroud)
这是失败的,因为std::vector您调用的构造函数是
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它试图用 10 次调用默认构造函数来填充向量,但默认构造函数foo并不存在。
此外,您的所有示例new都会失败,因为向量期望类型为 的对象foo,而不是foo *。此外,vector<foo *>除非您delete在清除向量之前手动更改每个成员,否则更改为也会失败。如果您确实想采用动态内存分配路线,请创建一个vector< shared_ptr< foo > >. 在Boost 库shared_ptr中可用,或者如果您的编译器包含 TR1 库,它将出现在命名空间内的标头中,或者如果您的编译器具有 C++0x 库,它将在命名空间本身中可用。<memory>std::tr1std
您可能应该执行以下操作:
vector<foo> bar;
bar.reserve(10);
bar.push_back( foo( 1, 2 ) );
...
...
bar.push_back( foo( 10, 20 ) ); //10 times
Run Code Online (Sandbox Code Playgroud)