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

vto*_*c85 4 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];
};
Run Code Online (Sandbox Code Playgroud)

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

void main(){
  Partition* p=/*...*/;
  FS::mount(p);
  /*...*/
}
Run Code Online (Sandbox Code Playgroud)

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

while(available[i]) i++;
Run Code Online (Sandbox Code Playgroud)

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

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

Alo*_*ave 10

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

bool KernelFS::available[] = {0};
Run Code Online (Sandbox Code Playgroud)


Ada*_*man 5

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

bool KernelFS::available[] = {false};
Run Code Online (Sandbox Code Playgroud)

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

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