初始化两个相互引用的结构数组
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_p0
或 choices_p1
。如果我颠倒顺序,初始化 choices_p0
我会遇到 &phases[1]
,目前还不知道。
初始化此类结构的正确方法是什么?
可以通过在 phases
:
定义之前 声明 choices_p0
和 choices_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
该计划有多个阶段,当一个阶段结束时,会选择一个新的阶段。
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]
,目前还不知道。
初始化此类结构的正确方法是什么?
可以通过在 phases
:
choices_p0
和 choices_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