C++ 初始化相互引用的两个结构数组
该计划有多个阶段,当一个阶段结束时,可以选择一个新的阶段C++ 初始化相互引用的两个结构数组,c++,struct,initialization,C++,Struct,Initialization,该计划有多个阶段,当一个阶段结束时,可以选择一个新的阶段 struct PhaseChoice; struct Phase { PhaseChoice* choices; }; struct PhaseChoice { bool (*condition)(); Phase* newPhase; }; …这项前瞻性声明很有效。但是我初始化它有困难 Phase phases[2] = { { choices_p0 }, { choices_
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] },
};
这显然失败了,因为在初始化阶段[2]
时,程序仍然没有关于选项\u p0
或选项\u p1
的线索。如果我颠倒顺序,初始化选项\u p0
我将遇到&阶段[1]
,目前还未知
初始化此类结构的正确方法是什么?可以通过在定义阶段之前声明选项\u p0
和选项\u 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
C还是C++?选择一个。注意:这不是有效的C代码。@Olaf:两种语言的解决方案是否不同?编译结果将完全不同:C编译器将报告错误。即使您做到兼容,每种语言也有不同的方式。重复一下:C和C++是不同的语言。当你可以在C++中编程C类时,对于相同的语法有细微的差别。两种语言的正确解决方案有显著差异。您确实在转发声明中包含了extern
关键字?错误:重新声明“PhaseChoice choices\u p0[2]”
和注意:以前的声明“PhaseChoice{anonymous}::choices\u p0[2]”
是。除了前面有extern
和,我一字不差地复制了这行代码代码>而不是<代码> = < /C> > .btw,而这些文件是在C++下编译的,这些数据类型的头包含在 Extn“C”< /C>中,因为它们也将在C程序中使用(C++和C之间的公共数据结构)。