用C++中的参数在构造函数中定义自己类的数组

Define array of own class in constructor with parameter in C++

本文关键字:自己 数组 定义 C++ 参数 构造函数      更新时间:2023-10-16

如何在另一个类的构造函数中创建自己类的数组,该构造函数的大小和参数在运行时给定?

class Row {
  ...
  Row(int n) { ... }
  ...
}

我想在中使用它

class Foo {
  Row *row; // pointer to array containing rows
  Foo(int n, int y) {
    row = new Row[y](n);
  }
}

这不起作用,也没有找到解决方案。我也读过Vector和reserve,但他怎么知道Row的大小?

我也读过关于矢量和保留

当你说"矢量"时,你可能是指std::vector

reservestd::vector的成员函数,但它与您的问题无关(如果我理解正确的话),因为它只涉及向量的内部内存管理。

class Foo {
  std::vector<Row> rows;
  Foo(int n, int y) : rows(y, n) {} // no call to `reserve` necessary
  // ...
};

但是他怎么知道Row的大小呢?

你的意思可能是std::vector似乎能够初始化一个动态的Row对象数组,每个对象都传递一个构造函数参数,而你自己的代码尝试却失败了

答案是std::vector(或者更确切地说,std::allocator,它是std::vector模板中使用的默认分配器)不使用new[]。它使用了一个称为placementnew的C++功能。

简单地说,这允许向量将内存分配和构造函数调用分开。这是一种低级的内存管理技术,在错误的人手中非常危险。

但是,即使是初学者,意识到它的存在也不会有什么坏处,因为它强调了一个事实,即new[]delete[]确实是C++的错误特征。只是不要使用它们使用标准容器类,如std::vector即使在几年后的某个遥远的日子里,你不得不编写自己的非常低级的容器类,放置new将是一个更好的选择。