使用私有变量初始化数组

Using private vars to initialize array

本文关键字:初始化 数组 变量      更新时间:2023-10-16

我正在尝试做一个小的应用程序,将计算一些路径为一个给定的图。

我创建了一个类来处理简单的图形,如下所示:

class SimpleGraph {
    int _nbNodes;
    int _nbLines;
   protected:
    int AdjMatrix[_nbNodes, _nbNodes]; //Error happens here...
    int IncMatrix[_nbNodes, _nbLines]; //...and here!

   public:
    SimpleGraph(int nbNodes, int nbLines) { this->_nbNodes = nbNodes - 1; this->_nbLines = nbLines - 1; };
    virtual bool isSimple();
};

在编译时,我在两个受保护成员声明中得到一个错误。

我不明白是什么错了,因为只有一个构造函数接受这些值作为参数。因此,它们不能被初始化。

我在这里错过了什么?

编译器需要知道为SimpleGraph类的成员分配多少空间。然而,由于AdjMatrixIncMatrix是在堆栈上定义的,并且它们的大小是在运行时(即编译后)确定的,因此它不能这样做。具体来说,标准规定类中数组的大小必须是constexpr

要解决这个问题,可以:

  • 在堆上分配AdjMatrixIncMatrix,然后你可以在运行时分配内存
  • 为两个数组使用固定的大小,并将它们保存在堆栈中。

,

代码的另一个主要问题是不能使用逗号创建多维数组(AdjMatrix[int, int])。你必须使用:

  • AdjMatrix[int][int]
  • AdjMatrix[int * int]

c++中的对象有一个固定的大小,需要在编译时知道。AdjMatrix和InMatrix的大小在编译时不知道,只在运行时知道。

int AdjMatrix[_nbNodes, _nbNodes]; //Error happens here...
int IncMatrix[_nbNodes, _nbLines]; //...and here!

数组表示法错误。在c++中不能以这种方式指定二维数组。正确的符号是在每个维度上使用括号,例如:

int data[5][2];

对于你所面临的问题,c++中数组的维数必须在编译时指定,即:编译器在编译程序时必须知道用来指示数组维度的值是什么。这里的情况显然不是这样。您必须恢复到使用整数字面值,就像我的例子一样,或者将代码更改为使用vector:

std::vector<std::vector<int> > AdjMatrix;

和构造函数中的

SimpleGraph(int nbNodes, int nbLines) : AdjMatrix(nbNodes) {
    for (int i = 0; i< nbNodes; i++)
        AdjMatrix[i].resize(20);
}

请注意,您将不再需要_nbNodes,而是在AdjMatrix上使用size()方法。您必须为IncMatrix做同样的事情。

如果您在编译时知道这些值,另一种选择是使用宏符号定义它们。

#define NBNODES  20
int AdjMatrix[NBNODES][NBNODES];

,但由于您希望将它们作为构造函数参数传递,因此这可能不适合您的需要。但是,如果您知道在编译时参数是常量,那么您可以在构造函数参数上使用c++ 11 constexpr限定符。