Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化相互引用的两个结构数组_C++_Struct_Initialization - Fatal编程技术网

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之间的公共数据结构)。