具有构造函数的类的 C++ vector

标签 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.

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

最佳答案

当不需要创建动态内存时,为什么要使用 new?当然,使用 new 会失败,当 push_back 接受 foo 时,它会导致 foo*。 (毕竟,这就是你所拥有的 vector 。)

push_back 有什么问题?如果要预先保留内存,请使用 reserve();在 vector 的构造函数中提供一个数字会生成第二个参数的多个拷贝(隐含地是 foo(),这将不起作用,因此会出现错误),这是'与简单地保留内存相同。

如果正确执行操作(没有 new)崩溃,则错误出在您的代码中,而不是 vector 中。您可能还没有编写管理资源的适当类。*(记住 The Big Three,使用 copy-and-swap idiom。)

*我这样说是因为你说“//长度取决于 arg1 和 arg2 的数组 ”,我怀疑这意味着你的类(class)某处有 new[]。没有三巨头,你的资源管理将失败。

无论如何你都不应该管理资源,类有一个责任。这意味着它应该是动态数组,或者使用动态数组,但不能同时管理和使用动态数组。因此,将资源分解到他们自己的类中,然后创建另一个使用它们的类(你的)。动态数组是一个 std::vector,因此您已经完成了它。 任何时候当你需要一个动态数组时,使用一个vector;没有理由不这样做。

关于具有构造函数的类的 C++ vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3437017/

相关文章:

swift - 我的快速方法没有输出

Java - 有类型的类?

c++ - 构造函数 : init() method, 指针中的异常,大型 try/catch 或..?

java - 明智地使用重载

C++ 初始化继承的模板基类

c++ - 如何从 x64 程序集中的堆栈获取参数?

c++ - Qt 应用程序和 Google Breakpad

c++ - 最大化和最小化未停靠的 QDockWidget 中的按钮

c++ - 使用静态库比包含头文件有什么好处?

c++ - 成员(member)使用无效(您是否忘记了“&”?)