我有这些课程:
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对象,所以我认为没有使用构造函数......
答案 0 :(得分:10)
您需要在(确切地)一个cpp文件中定义它:
bool KernelFS::available[] = {0};
答案 1 :(得分:5)
问题是数组永远不会分配任何内存。您应该在全局范围中添加它:
bool KernelFS::available[] = {false};
确保在一个cpp文件中执行此操作。将其添加到多个cpp文件中将导致链接期间出现重复的符号错误。此外,您不应该在头文件中执行此操作。最好的方法是在cpp文件中添加KernelFS
类的实现。
另请注意,不保证跨编译单元的静态初始化顺序。因此,您不应该从另一个文件中的静态初始化代码中调用KernelFS::mount()
。