【问题标题】:Creating an n by n grid, where each element is a pointer to an object创建一个 n × n 网格,其中每个元素都是指向对象的指针
【发布时间】:2017-10-07 03:20:32
【问题描述】:
class ClassName {
    A* grid[][];
}

我收到“‘网格’声明为多维数组必须具有除第一个维度之外的所有维度的边界”错误。问题是在我运行程序之前我不会知道尺寸,其中尺寸是参数之一。

指令指出网格的每个元素都应该是一个 A*——即指向 A 类型对象的指针。

我该怎么做?

【问题讨论】:

  • 如何在析构函数中删除网格?
  • 你确定这是你需要的,而不是std::vector<std::vector<A>>

标签: c++ pointers multidimensional-array


【解决方案1】:

您可以选择这样定义gridA*** grid;。当然,您必须使用此设置动态分配内存:

class ClassName {
    A*** grid;
    int nCols, nRows;

public:
    ClassName(int cols, int rows) {
        nCols = cols;
        nRows = rows;

        grid = new A**[nCols];
        for (int i = 0; i < nCols; i++) {

            grid[i] = new A*[nRows];
            for (int j = 0; j < nRows; j++) {

                grid[i][j] = nullptr;
            }
        }
    }

    ~ClassName() {
        for (int i = 0; i < nCols; i++) {
            delete[] grid[i];
        }

        delete[] grid;
    }
};

【讨论】:

  • 谢谢有道理!但是在析构函数中,我得到“'grid' is not declared in this scope
  • 特别是在“delete[] grid[i]”行
  • 我确实这样做了。我在头文件中有这两行,在 cpp 文件中有构造函数和析构函数
  • 很好!我忘记了 public 关键字,所以如果你还没有添加它,你也必须添加它;否则你将无法在类外构造ClassName 对象。
  • 根据经验,当您在声明中到达*** 时,您将危险地接近成为a Three Star Programmer,并且通常应该再次审查设计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多