2013-03-28 51 views
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(); 
}; 

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

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

我在这里错过了什么?

+1

您必须使用动态内存分配和'new'关键字 – acrilige 2013-03-28 07:03:39

+0

@acrilige使用封装类(通常是'std :: vector')比手动处理分配,复制安全和异常安全强烈得多。 – Angew 2013-03-28 07:45:43

回答

1

在行

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

阵列符号是错误的。你不能在C++中指定一个2维数组。正确的符号使用括号上每个维度,如例如:

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,并在AdjMatrix上改用size()方法。您需要为IncMatrix做同样的事情。

另一种选择,如果你知道在编译时的值,是使用宏来象征性地定义它们。

#define NBNODES 20 

int AdjMatrix[NBNODES][NBNODES]; 

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

3

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

为了解决这个问题,您可以:

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

-

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

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

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