2012-01-25 2 views
3

У меня есть эти классы:Инициализировать статический массив в C++

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 :: монтаж (р) называется, его вызывает myImpl-> mount (p) (что является функцией класса KernelFS). И вот проблема. Когда дело доходит до

while(available[i]) i++; 

... это ломается! Я думаю, проблема в том, что я не инициализировал доступный массив [26], и я понятия не имею, как это сделать ... Что еще может быть проблемой? Пожалуйста помоги.

Btw, главный() никогда не создает FS или KernelFS объектов, так что я думаю, что нет никакой пользы конструкторов ...

+0

'KernelFS * myImpl;' объявлен статическим, правильно? – dasblinkenlight

+0

Возможно [инициирование заказа] (http://stackoverflow.com/q/335369/318716) связано? –

+1

это уже было рассмотрено в [другом вопросе] (http://stackoverflow.com/questions/1065774/cc-initialization-of-a-normal-array-with-one-default-value) –

ответ

9

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

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

всегда выглядел уродливым, но thats it – Ulterior

+0

Что делать, если начальные значения не совпадают? Могу ли я использовать цикл? – zdd

+0

@zdd: Ну, это будет действительно интуитивно, но если вы действительно хотите добиться успеха, вот [реализация] (http://codepad.org/lG5i4Oiy). –

5

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

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

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

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

Смежные вопросы