如何解决依赖类?

时间:2010-09-27 09:01:31

标签: c++ circular-dependency

我有两个相互依赖的课程。我之前已经解决了这个问题,但我不能为我的生活记住如何解决这个问题。我的简化代码是:

struct MenuOption{
  string Text;
  int Choice;
  bool UseSubMenu;
  Menu SubMenu;
};

class Menu{
public:
  Menu(MenuOption optionlist[],int optioncount);
};

4 个答案:

答案 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。