vtomic85
vtomic85

Reputation: 611

Initialize static array in C++

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

Answers (2)

Adam Zalcman
Adam Zalcman

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

Alok Save
Alok Save

Reputation: 206508

You need to define it in (exactly)one of your cpp files:

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

Upvotes: 10

Related Questions