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

4

我有这些类:

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++;

...它出现了问题!我觉得问题在于我没有初始化数组available [26],而且我不知道怎么做...还有什么其他的问题呢?请帮帮我。

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


KernelFS* myImpl; 被声明为静态变量,是吗? - Sergey Kalinichenko
可能与初始化顺序有关? - Joseph Quinsey
1
这个问题已经在另一个问题中得到了解决。 - João Portela
2个回答

10

你需要在一个(精确的)cpp文件中定义它:

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

1
总是看起来很丑,但就是这样。 - Ulterior
如果初始值不同怎么办?我可以使用循环吗? - zdd
@zdd:你有没有尝试使用我提供的方法来检查静态数组的情况?没有任何区别。 - Alok Save
@Alok Save,正如所说的那样,将静态数组的所有元素初始化为相同的值,如果我想要不同的初始值怎么办?例如,array[0] = 1,array[1] = 2,...,我不想一个一个列出所有元素。因此,我需要一个循环(for或while),但似乎没有办法在函数外使用循环。 - zdd
1
@zdd:当你发表第一条评论时,我已经理解了你的要求。我在之前的评论中所说的是,我展示的代码示例可以轻松修改为将数组作为静态类成员。这里是我为你做的。 - Alok Save
显示剩余2条评论

5
问题在于数组从未分配任何内存。您应该在全局范围内添加以下内容:
bool KernelFS::available[] = {false};

请确保只在一个cpp文件中添加。在多个cpp文件中添加会导致链接时出现重复符号错误。此外,不应在头文件中这样做。最好的方法是将其添加到实现KernelFS类的cpp文件中。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接