【问题标题】:Dynamic Array allocation of a type with a custom constructor (C++) [duplicate]具有自定义构造函数的类型的动态数组分配(C++)[重复]
【发布时间】:2019-03-18 00:13:35
【问题描述】:

我有以下类和结构(为简单起见,已删除)

啊.h

class A {
    B *myArray;
}

a.cc

A::A() {
    myArray = new B[1];
}

b.h

struct B {
    int number;
}

b.cc

B::B(int n): number(n)  {
}

如您所见,B 类只有接受整数的构造函数,所以当我执行myArray = new B[1] 时,它会抛出no matching constructor for initialization of 'B[1]'

我该如何解决这个问题?我试过做一个指针数组而不是B 类型的数组,但由于信息输入程序的方式,它不起作用。

无法B 添加新的构造函数。我只能添加私有变量和方法。我只能使用以下库:iostream、fstream、sstream、iomanip、string 和实用程序。

【问题讨论】:

  • 你能简单地使用std::vector<>吗?
  • 改用std::vector。它具有内置功能来处理非默认可构造类型。对于每个动态数组,都有一个向量可以解决它的问题
  • 检查更新,我不能使用向量库
  • @MarkDodds 您命名的所有标题都与<vector> 在同一个库中。那是标准库。您命名的其中一个人(例如string)使用<vector> 也就不足为奇了。

标签: c++ arrays class dynamic


【解决方案1】:

由于您为B 定义了构造函数,因此不再为您定义默认构造函数。

当您执行myArray = new B[1]; 时,您试图在调用B 的默认构造函数时构建一个大小为1 的数组,但不存在这样的构造函数!

这可以通过创建自己的默认B 构造函数或调用分配时创建的构造函数来解决。后者可以通过:

myArray = new B[1]{5};

在这里查看它的工作原理:ideone

【讨论】:

  • “你不再有为你定义的默认构造函数” - 可以通过编写一个来修复,如果默认的就足够了,将其声明为= default;
  • @JesperJuhl OP 无法做到的事情
  • @JesperJuhl 好点。补充说,创建自己的默认 c'tor 绝对是一种选择。
  • 可惜你不能只利用聚合。
【解决方案2】:

问题是您没有B 的默认构造函数。您必须为唯一参数提供一个或至少一个默认值(构造函数也应标记为explicit

另一种选择是使用vector。无论如何,您都应该避免使用任何显式的delete,因此它是您所拥有的更好的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-13
    • 2012-05-06
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    相关资源
    最近更新 更多