4

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...

3
  • KernelFS* myImpl; is declared static, correct? Commented Jan 25, 2012 at 10:09
  • Perhaps initiation order related? Commented Jan 25, 2012 at 10:10
  • 1
    this as already been addressed in another question Commented Jan 25, 2012 at 10:15

2 Answers 2

10

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

bool KernelFS::available[] = {0};
Sign up to request clarification or add additional context in comments.

7 Comments

always looked ugly, but thats it
What if the initial values are not same? Can I use a loop?
@zdd: Well it will be really intuitive but if you really want to get it towork, here is an implementation.
@Alok Save, I look at the code again, it's not an static array, even not a array in a class, can you double check it?
@zdd: I understood what your requirement is when you posted your first comment. What I said in my previous comment is the code example I showed can be easily modified to make array a static class member. Here i did it for you.
|
5

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.