数组分为头文件和源文件

时间:2011-10-14 18:48:01

标签: c++

由于某些奇怪的原因,我总是忘记了数组的确切语法。如何在标头中创建一个数组并在构造函数中初始化它?是否可以在标题中初始化它并定义它?

3 个答案:

答案 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>