1

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

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

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();
};

在编译时,我收到两个受保护成员声明的错误。

我不明白出了什么问题,因为只有一个构造函数将这些值作为参数。因此,它们不能未初始化。

我在这里想念什么?

4

3 回答 3

3

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

要解决此问题,您可以:

  • 而是在堆上分配AdjMatrixIncMatrix,然后您可以在运行时分配内存。
  • 对两个数组使用固定大小并将它们保留在堆栈上。

--

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

  • AdjMatrix[int][int]
  • AdjMatrix[int * int]
于 2013-03-28T07:02:14.313 回答
2

C++ 中的对象具有固定大小,需要在编译时知道。AdjMatrix 和 InMatrix 的大小在编译时是未知的,只有在运行时才知道。

于 2013-03-28T07:02:55.753 回答
1

在行中

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

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

int data[5][2];

关于您面临的问题,C++ 中数组的维度必须在编译时指定,即。编译器必须知道在编译程序时用于指示数组维度的值是什么。这显然不是这里的情况。您必须恢复使用整数文字,如我的示例中所示,或更改代码以使用向量:

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,而是size()使用AdjMatrix. 您将必须为IncMatrix.

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

#define NBNODES  20

int AdjMatrix[NBNODES][NBNODES];

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

于 2013-03-28T07:27:02.723 回答