如何通过调用非默认构造函数来构造对象数组?

Zee*_*yat -1 c++ arrays constructor pointers

我有一个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)
}
Run Code Online (Sandbox Code Playgroud)

如何hi::hi(int,int)在标记的线上调用(1)

YSC*_*YSC 6

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

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

hello = new hi[5]{{1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}};
Run Code Online (Sandbox Code Playgroud)

如果hi不是聚合,本身就不能.但随着一些改进,我们可以实现它.

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

这给出了:

class hi {
    hi();
public:
    hi(int a, int b){};
};
Run Code Online (Sandbox Code Playgroud)

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

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

这给出了:

std::vector<hi> his;
Run Code Online (Sandbox Code Playgroud)
  1. 使用std::generate_n来构建你的对象:

这给出了:

his.reserve(number_of_instances);
std::generate_n(std::back_inserter(his), number_of_instances, [](){ return hi{0, 0}; });
Run Code Online (Sandbox Code Playgroud)

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

演示

另一种方法是将一些内存保留为其中的数组unsigned charhi使用placement news 构造其中的实例.

  • 保留的内存不计入向量的范围.这里`开始(他的)==结束(他的)` (2认同)