使用私有变量初始化数组
Using private vars to initialize array
我正在尝试做一个小的应用程序,将计算一些路径为一个给定的图。
我创建了一个类来处理简单的图形,如下所示:
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
类的成员分配多少空间。然而,由于AdjMatrix
和IncMatrix
是在堆栈上定义的,并且它们的大小是在运行时(即编译后)确定的,因此它不能这样做。具体来说,标准规定类中数组的大小必须是constexpr
。
要解决这个问题,可以:
- 在堆上分配
AdjMatrix
和IncMatrix
,然后你可以在运行时分配内存 - 为两个数组使用固定的大小,并将它们保存在堆栈中。
,
代码的另一个主要问题是不能使用逗号创建多维数组(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
限定符。
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在函数内部的声明中初始化数组,并在外部使用它
- 为什么用结构初始化数组需要指定结构名称
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++使用另一个数组和新值初始化数组
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在 constexpr 构造函数中初始化数组是否合法?
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 在构造函数中初始化数组
- 是否可以使用函数返回的值初始化数组
- 使用宏使用额外元素初始化数组
- 在循环中显示不同值的初始化数组
- 如何在macOS中的旧扩展clang和gcc编译器中初始化数组和向量
- 使用可变模板列表初始化数组,并放置new
- 使用函数从 Visual Studio 2017 中的 main 创建和初始化数组
- 使用 c++ 中的函数初始化数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- C++ 使用变量而不是常量表达式初始化数组
- 在初始化列表中初始化数组的更好方法
- 在可变参数模板类中初始化数组