我有两个相互依赖的课程。我之前已经解决了这个问题,但我不能为我的生活记住如何解决这个问题。我的简化代码是:
struct MenuOption{
string Text;
int Choice;
bool UseSubMenu;
Menu SubMenu;
};
class Menu{
public:
Menu(MenuOption optionlist[],int optioncount);
};
答案 0 :(得分:3)
即:
// Forward declaration to assure A of B's existence.
class B;
class A { // uses B
B* b;
};
class B { // uses A
A* a;
};
答案 1 :(得分:1)
使用前向声明
struct MenuOption;
class Menu{
public:
Menu(MenuOption optionlist[],int optioncount);
};
struct MenuOption {
string Text;
int Choice;
bool UseSubMenu;
Menu SubMenu;
};
您不需要将任何数据成员作为指针。上面的代码片段中没有“递归无限大小”。
独立于此,使SubMenu
成为指针仍然是一个好主意。因为它似乎不需要有子菜单,是吗?所以你应该使用一个指针,否则该成员总是是一个菜单,需要初始化。指针可以保持未初始化或作为空指针。您可能还想使用boost::optional<>
代替
struct MenuOption {
string Text;
int Choice;
boost::optional<Menu> SubMenu;
};
答案 2 :(得分:0)
您需要使用指针而不是对象。在这种情况下,我相信SubMenu
需要Menu*
修改强>
实际上,正如其他人提到的前瞻性宣言也需要。但是使用前向声明,您只需定义指针/引用,但不能创建对象。当您尝试创建对象时,编译器需要知道对象的sizeof
是什么,这是不可用的(即使您转发声明)。使用前向声明,您告诉编译器Menu
类型为class
,并且您正在编写指向Menu
类型对象的指针。想一想,将一个实例放到另一个实例中将是无限的重复。
答案 3 :(得分:0)
class Menu;
struct MenuOption{
string Text;
int Choice;
bool UseSubMenu;
Menu* SubMenu;
};
class Menu{
public:
Menu(MenuOption optionlist[],int optioncount);
};
基本上,你'向前声明'类菜单,然后使用指向Menu的指针作为SubMenu。