【问题标题】:C++ Set 2d array sizes of class member array in constructorC++ 在构造函数中设置类成员数组的二维数组大小
【发布时间】:2017-03-08 00:00:02
【问题描述】:

我只找到了一维数组的解决方案,但无法将它们应用于二维数组。 可能的解决方案包括“向量”、“模板”和“指向数组的指针”。

我知道我可以让向量工作,但我宁愿使用其他两个中的任何一个。最好使用模板,因为我不想手动破坏,但指针也可以工作。 (指针将指向在构造函数中创建的数组)。

该类包含一个名为 screen 的空二维数组。构造函数应该设置它的大小。我尝试了太多东西,无法在这里全部列出,但我会展示我目前拥有的东西。 (我尝试的最后一件事是指向在构造函数中创建的数组的指针。在这种情况下,屏幕是一个字符指针)

Screen::Screen(const int w, const int h) : screen(new char[h][w]) {} {
    width = w;
    height = h;
}

new-expression 中的数组大小必须是常数

我未能实施这些策略中的任何一个,并且在尝试使其发挥作用时收到了许多错误。我将如何解决这个问题? (主要是我想知道如何使用模板来做到这一点。如果不可能,那么使用指向在构造函数中创建的数组的指针)

【问题讨论】:

  • 向量、模板和指向数组的指针是如何连接的......无论如何,我不明白你的问题。发布一些您尝试编写的实际代码,我们会看看它有什么问题。
  • 先添加一些代码,告诉我们你尝试了什么。
  • wh 的值是否在编译时都是已知的?
  • 使用带有二维索引运算符的一维数组可能是您的最佳解决方案
  • 这些值在编译时未知(可能),但一旦创建类就不需要更改。 (这就是为什么我真的不想使用向量,因为我不打算扩展数组,只需要数组功能)

标签: c++ arrays


【解决方案1】:

这个问题有点模棱两可,但听起来你想在给定一些输入的情况下动态分配一个数组。 编辑我更改了答案以匹配您提供的代码。给定高度和宽度,这将创建一个二维字符数组。

class Screen {
    private:
        char **data;
        int rows;
        int columns;

    public:
        Screen(int num_rows, int num_cols); 
}; 

Screen::Screen(int num_rows, int num_cols) {
    data = new char * [num_rows];
    for (int i = 0; i < num_rows; ++i) {
        data[i] = new char[num_cols];
    }
    rows = num_rows;
    columns = num_cols;
}

这会创建一个空的二维字符数组。

解释:c 中的所有数组都只是指向您声明的类型的内存中的第一个块的指针。通过将成员变量作为双指针,您拥有一个 char 指针数组,每个指针指向各自数组中的第一个值。

但要小心,您需要通过声明析构函数来释放数据变量以避免内存泄漏。

Screen::~Screen() {
    for (int i = 0; i < rows; ++i) {
        delete[] data[i];
    }
    delete[] data;
}

【讨论】:

  • 您忘记释放析构函数中的某些内容。 delete[] data
  • 这是很多乱七八糟的东西,违反了三原则——你应该使用一个向量或一个向量的向量而不是这种方法
  • 我同意向量向量会容易得多,但他确实询问了如何在构造函数中使用模板或指向数组的指针来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2015-02-21
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多