Reputation: 611
I have these classes:
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];
};
Main program only uses static functions from FS, e.g:
void main(){
Partition* p=/*...*/;
FS::mount(p);
/*...*/
}
When FS::mount(p) is called, it calls myImpl->mount(p) (which is a function from KernelFS class). And here's the problem. When it comes to
while(available[i]) i++;
...it breaks! I think the problem is that I haven't initialized the array available[26], and I have no idea how to do that... What else can be the problem? Please help.
Btw, main() never creates FS or KernelFS objects, so I think that there is no use of constructors...
Upvotes: 4
Views: 18230
Reputation: 27233
The problem is that the array is never allocated any memory. You should add this in the global scope:
bool KernelFS::available[] = {false};
Make sure you do it in one cpp file. Adding it in more than one cpp file will result in duplicate symbol error during linking. Also, you shouldn't do this in a header file. The best approach is to add this in the cpp file with the implementation of the KernelFS
class.
Note also that static initialization order across compilation units isn't guaranteed. Hence you shouldn't call KernelFS::mount()
from static initialization code in another file.
Upvotes: 5
Reputation: 206508
You need to define it in (exactly)one of your cpp files:
bool KernelFS::available[] = {0};
Upvotes: 10