【问题标题】:How to construct a array of object by invoking a non-default constructor? [duplicate]如何通过调用非默认构造函数来构造对象数组? [复制]
【发布时间】:2018-04-23 08:12:04
【问题描述】:

我有一个类hi,它带有一个带两个参数的非默认构造函数。我正在尝试构造his 的数组:

class hi {
  public:
    hi(int a, int b){};
};

int main() {
  hi *hello;
  int number_of instance = 5;
  hello = new hi[number_of_instance]; // (1)
}

如何在标有(1)的行上调用hi::hi(int,int)

【问题讨论】:

  • hello = new hi[5]{{1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}};

标签: c++ arrays pointers constructor


【解决方案1】:

如何调用hi::hi(int,int)

如果hi 实际上是一个聚合类型和/或您使用的是 C++11,您可以简单地使用以下代码构建它:

hello = new hi[5]{{1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}};

如果hi 不是一个聚合,那么你本身就不能。但只要稍加改进,我们就能做到。

  1. 声明一个私有的默认构造函数:

这给出了:

class hi {
    hi();
public:
    hi(int a, int b){};
};

这个想法是为标准容器提供一个默认构造函数来查找,即使std::is_default_constructible_v<hi>false。显然,任何实际上默认构造hi 的尝试都将以编译失败告终。

  1. 使用std::arraystd::vector 代替C 数组:

这给出了:

std::vector<hi> his;
  1. 使用std::generate_n 构造您的对象:

这给出了:

his.reserve(number_of_instances);
std::generate_n(std::back_inserter(his), number_of_instances, [](){ return hi{0, 0}; });

但请注意,此向量作为非默认构造类型的向量是不完整的,您将无法使用它的所有功能。

Demo

另一种方法是将一些内存保留为unsigned char 的数组,并在其中构造his 实例,并放置news。

【讨论】:

  • 你能解释一下私有默认构造函数背后的原因吗?然而,这并没有回答原来的问题:/
  • 保留的内存不计入向量的范围。这里begin(his) == end(his)
  • std::generate_n(std::back_inserter(his), number_of_instances, [](){ return hi{0, 0}; });
  • @Default 看PasserBy的评论;)
  • @Default Jorge cmets 这个答案的最后一句话“另一种方法是将一些内存保留为无符号字符数组和......”
【解决方案2】:

使用向量

std::vector<hi> hello{{1,2},{1,2},{1,2},{1,2},{1,2}};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多