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

Posted

技术标签:

【中文标题】在 C++ 中使用参数在构造函数中定义自己的类的数组【英文标题】:Define array of own class in constructor with parameter in C++ 【发布时间】:2015-11-15 11:50:38 【问题描述】:

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

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<Row> row; 将是正确的工具。可以在构造函数成员初始化列表中初始化为row(y,n) 【参考方案1】:

我还阅读了有关 Vector 和 Reserve 的文章

当您说“矢量”时,您可能指的是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[]。它使用名为placement new 的C++ 功能。

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

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

【讨论】:

嗨,如果我理解正确的话,vector 是一种列表,所以我没有对元素的常量(即时)访问权限? @Sneedlewoods:不。您将std::vectorstd::list 混淆了。向量的元素访问在恒定时间内运行,即 O(1)。 我仍然对 Foo(int n, int y) 感到困惑:rows(y, n) - 我想做类似 for (int i = 1; i row; @Sneedlewoods:Foo(int n, int y) : rows(y, n) 到底有什么问题? rows 是一个向量,我不明白这个 rows(y, n) 是做什么的,向量怎么知道如何处理它。

以上是关于在 C++ 中使用参数在构造函数中定义自己的类的数组的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中定义对象而不调用其构造函数

在哪些情况下调用 C++ 复制构造函数?

类的继承

c++,类的对象作为形参时一定会调用复制构造函数吗?

用C++设计一个不能被继承的类(转)

C++中复制构造函数被调用的三种情况