Инициализировать статический массив в C ++ - PullRequest
4 голосов
/ 25 января 2012

У меня есть эти классы:

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, поэтому я думаю, что конструкторы не используются ...

Ответы [ 2 ]

10 голосов
/ 25 января 2012

Вы должны определить его (точно) в одном из ваших файлов cpp:

bool KernelFS::available[] = {0};
5 голосов
/ 25 января 2012

Проблема в том, что массиву никогда не выделяется какая-либо память.Вы должны добавить это в глобальной области видимости:

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

Убедитесь, что вы делаете это в одном файле cpp.Добавление его в более чем один файл cpp приведет к ошибке дублированного символа во время компоновки.Кроме того, вы не должны делать это в заголовочном файле.Наилучшим подходом является добавление этого в файл cpp с реализацией класса KernelFS.

Обратите также внимание, что порядок статической инициализации в единицах компиляции не гарантируется.Следовательно, вы не должны вызывать KernelFS::mount() из статического кода инициализации в другом файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...