初始化两个相互引用的结构数组

Initializing two arrays of structs referencing each other

该计划有多个阶段,当一个阶段结束时,会选择一个新的阶段。

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_p0choices_p1。如果我颠倒顺序,初始化 choices_p0 我会遇到 &phases[1],目前还不知道。

初始化此类结构的正确方法是什么?

可以通过在 phases:

定义之前 声明 choices_p0choices_p1 数组轻松解决
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 关键字,或者定义数组。

我会说,用无效指针初始化它们,然后再赋值给它们。

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