2015-07-08 2 views
2

Программа имеет несколько этапов, и, как результат, выбор сделан для выбора нового.Инициализация двух массивов структур, ссылающихся друг на друга

struct PhaseChoice; 

struct Phase { 
    PhaseChoice* choices; 
}; 

struct PhaseChoice { 
    bool (*condition)(); 
    Phase* newPhase; 
}; 

... это форвардная декларация работает нормально. Но мне не удается инициализировать его.

Phase phases[2] = { 
    { choices_p0 }, 
    { choices_p1 } 
} 

PhaseChoice choices_p0[2] = { 
     { condition_p0p1, 
     &phases[1] }, 
     { condition_p0again, 
     &phases[0] }, 
}; 

PhaseChoice choices_p1[2] = { 
     { condition_p1p0, 
     &phases[0] }, 
     { condition_p1again, 
     &phases[1] }, 
}; 

Это, очевидно, не удается, так как при инициализации phases[2] программа еще не имеет понятия о choices_p0 или choices_p1. Если я отменил порядок, инициализируя choices_p0, я столкнусь с &phases[1], который пока неизвестен.

Каков правильный способ инициализации таких структур?

+0

C или C++? Выбери один. Примечание: это не действительный код C. – Olaf

+0

@Olaf: Будет ли решение отличаться между двумя языками? –

+0

Результат компиляции будет отличаться окончательно: компилятор C сообщит об ошибке. Даже если вы сделаете это совместимым, для каждого языка есть разные способы. Просто повторить его: C и C++ - разные языки. Пока вы _can_ программируете C-like в C++, существуют тонкие различия для одного и того же синтаксиса. И _proper_ решения на любом языке значительно отличаются. – Olaf

ответ

6

Может быть легко решена объявляющего в choices_p0 и choices_p1 массивы перед определением phases:

extern PhaseChoice choices_p0[2]; 
extern PhaseChoice choices_p1[2]; 

Phase phases[2] = { 
    { choices_p0 }, 
    { choices_p1 } 
}; 

PhaseChoice choices_p0[2] = { ... }; 
PhaseChoice choices_p1[2] = { ... }; 

Вам нужен extern ключевое слово для объявлений, или вы определить массивы.

+0

@ SF. Вы указываете ключевое слово 'extern' в переднем объявлении? –

+0

'error: redeclaration of PhaseChoice choice_p0 [2] '' и 'note: предыдущая декларация' PhaseChoice {anonymous} :: chosen_p0 [2] '' –

+0

Да. Я скопировал строку дословно, за исключением 'extern' спереди и'; 'вместо' = '. –

1

Я бы сказал, инициализируйте их недействительными указателями и позже назначьте их назначить.

Phase phases[2] = { 
    { nullptr }, 
    { nullptr } 
} 

PhaseChoice choices_p0[2] = { 
     { condition_p0p1, 
     &phases[1] }, 
     { condition_p0again, 
     &phases[0] }, 
}; 

PhaseChoice choices_p1[2] = { 
     { condition_p1p0, 
     &phases[0] }, 
     { condition_p1again, 
     &phases[1] }, 
}; 
phases[0] = choices_p0; 
phases[1] = choices_p1 
Смежные вопросы