代码之家  ›  专栏  ›  技术社区  ›  Earlz

如何解析依赖类?

  •  1
  • Earlz  · 技术社区  · 14 年前

    我有两个互相依赖的班级。我以前解决过这个问题,但我一辈子都记不起怎么解决这个问题了。我的简化代码是:

    struct MenuOption{
      string Text;
      int Choice;
      bool UseSubMenu;
      Menu SubMenu;
    };
    
    class Menu{
    public:
      Menu(MenuOption optionlist[],int optioncount);
    };
    
    4 回复  |  直到 14 年前
        1
  •  3
  •   Eli Bendersky    14 年前
    • 使用转发声明

    即。:

    // Forward declaration to assure A of B's existence.
    class B;
    
    class A { // uses B
      B* b;
    };
    
    class B { // uses A
      A* a;
    };
    
        2
  •  1
  •   Johannes Schaub - litb    14 年前

    使用转发声明

    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;
    };
    
        3
  •  0
  •   Vite Falcon    14 年前
    class Menu;
    struct MenuOption{
      string Text;
      int Choice;
      bool UseSubMenu;
      Menu* SubMenu;
    };
    
    class Menu{
    public:
      Menu(MenuOption optionlist[],int optioncount);
    };
    

    基本上,您“向前声明”类菜单,然后使用指向菜单的指针作为子菜单。

        4
  •  0
  •   Naveen    14 年前

    SubMenu Menu*

    编辑

    实际上,正如其他人所提到的,提前申报也是必要的。但是使用前向声明,您只能定义指针/引用,但不能创建对象。当您尝试创建一个对象时,编译器需要知道 sizeof 对象的,该对象不可用(即使您正向声明)。使用forward声明,您可以告诉编译器 Menu 属于类型 class 你正在划一个指针指向 键入对象。想想看,把一个实例一个放到另一个实例中是无限重复的。