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

时间:2018-04-23 08:12:04

标签: c++ arrays pointers constructor

我有一个类hi,其中一个非默认构造函数带有两个参数。我正在尝试构造一个hi s:

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

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

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

2 个答案:

答案 0 :(得分:6)

  

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

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

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

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

  1. 声明私有默认构造函数:
  2. 这给出了:

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

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

    1. 使用std::arraystd::vector代替C数组:
    2. 这给出了:

      std::vector<hi> his;
      
      1. 使用std::generate_n构建对象:
      2. 这给出了:

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

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

        Demo

        另一种方法是将一些内存保留为unsigned char的数组,并使用hi位置构建new个实例。

答案 1 :(得分:0)

使用矢量

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