使用私有变量来初始化数组

时间:2013-03-28 07:00:15

标签: c++ oop

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

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

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

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

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

我在这里缺少什么?

3 个答案:

答案 0 :(得分:3)

编译器需要知道为类SimpleGraph的成员分配多少空间。但是,由于AdjMatrixIncMatrix是在堆栈上定义的,并且它们的大小是在运行时确定的(即在编译之后),因此无法执行此操作。具体来说,标准表示类中数组的大小必须是constexpr

要解决此问题,您可以:

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

-

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

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

答案 1 :(得分:2)

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

答案 2 :(得分: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];

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