我正在尝试使用一个小程序来计算给定图形的某些路径。
我已经创建了一个处理简单图形的类,如下所示:
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();
};
在编译时,我收到两个受保护成员声明的错误。
我不明白什么是错的,因为只有一个构造函数将这些值作为参数。因此,它们不能是未初始化的。
我在这里缺少什么?
答案 0 :(得分:3)
编译器需要知道为类SimpleGraph
的成员分配多少空间。但是,由于AdjMatrix
和IncMatrix
是在堆栈上定义的,并且它们的大小是在运行时确定的(即在编译之后),因此无法执行此操作。具体来说,标准表示类中数组的大小必须是constexpr
。
要解决此问题,您可以:
AdjMatrix
和IncMatrix
,然后您可以在运行时分配内存。-
您的代码的另一个主要问题是您无法使用逗号(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
限定符。