由于某些奇怪的原因,我总是忘记了数组的确切语法。如何在标头中创建一个数组并在构造函数中初始化它?是否可以在标题中初始化它并定义它?
答案 0 :(得分:2)
您可以使用extern
关键字在标头中声明变量,但在标头中定义可能会导致多个定义和链接器错误(除非您使用static
关键字和标头保护,其中如果你要为每个翻译单元创建单独的数组实例。)
例如:
标题
extern int array[ARRAY_SIZE];
static int stArray[ARRAY_SIZE] = {initialized static array};
X.CPP
#include the header
int array[ARRAY_SIZE] = {initialize here}
... some code
int i = array[index]; //access the array initialized in X.CPP
int j = stArray[index]; //access the array initialized in X.CPP
//when including the header
y.cpp的
#include the header
// don't initialize
...
in some code do:
int i = array[index]; // you'll access the array initialized in X.CPP.
int j = stArray[index]; //access the array initialized in Y.CPP when
// including the header, not the same as in X.CPP
修改强>
Re类成员 - 它们通常在头文件中定义,但它们是在创建类实例(对象)时创建的,应该在构造函数中初始化。除非你将它们标记为static
,否则你必须在某个地方的CPP文件中定义它们(与extern
变量的方式类似)。
此外,评论中提到:在调用main
之前不应访问全局变量(即:不应根据另一个全局/静态值的值初始化一个全局/静态变量)。这可能会导致一个称为Static Initialization Fiasco的问题。
答案 1 :(得分:0)
好吧,你可能总是使用一个指针并动态地执行它......只需要记住用删除[]来清理它。
在标题中,只需声明一个指针......
int * x = 0;
在cpp中,调用new并使用它完成所需的操作。
x = new int[15];
//do stuff
delete [] x;
答案 2 :(得分:0)
我已经读过这个问题了,似乎不可能:这实际上是因为C ++语言的一个缺点 - 没有办法在C ++中初始化非静态数组成员。 / p>