在C ++中初始化静态数组

时间:2012-01-25 10:05:17

标签: c++ arrays static constructor initialization

我有这些课程:

class FS{
  static char mount(Partition* p)
      {return myImpl->mount(p);}
  /*...*/
  KernelFS* myImpl;
};

class KernelFS{
char mount(Partition* p){
   /*...*/
   while(available[i]) i++;
}
  /*...*/
  static bool available[26];
};

主程序仅使用FS中的静态函数,例如:

void main(){
  Partition* p=/*...*/;
  FS::mount(p);
  /*...*/
}

当调用FS :: mount(p)时,它调用myImpl-> mount(p)(这是来自KernelFS类的函数)。这就是问题所在。

while(available[i]) i++;

......它破了!我认为问题是我没有初始化可用的数组[26],我不知道该怎么做......还有什么问题呢?请帮忙。

顺便说一下,main()从不创建FS或KernelFS对象,所以我认为没有使用构造函数......

2 个答案:

答案 0 :(得分:10)

您需要在(确切地)一个cpp文件中定义它:

bool KernelFS::available[] = {0};

答案 1 :(得分:5)

问题是数组永远不会分配任何内存。您应该在全局范围中添加它:

bool KernelFS::available[] = {false};

确保在一个cpp文件中执行此操作。将其添加到多个cpp文件中将导致链接期间出现重复的符号错误。此外,您不应该在头文件中执行此操作。最好的方法是在cpp文件中添加KernelFS类的实现。

另请注意,不保证跨编译单元的静态初始化顺序。因此,您不应该从另一个文件中的静态初始化代码中调用KernelFS::mount()