相互引用的C ++嵌套类

时间:2018-11-21 14:26:17

标签: c++ class nested visual-studio-2017

在C#中,我可以有两个嵌套的类互相引用而不会出现问题:

public class CFGFile
{
  class Setting
  {
    public Entry Ent;
  }

  class Entry
  {
    public Setting Setg;
  }
}

但是,在C ++中尝试相同的操作会导致问题:

class CFGFile
{
  class Setting;

  class Entry
  {
    Setting Setg;
  };

  class Setting
  {
    Entry Ent;
  ]
};

我知道

  

“不允许使用不完整的类型”

在Setg变量定义中,以及错误

  

“ C2079:'CFGFile :: Entry :: Setg'使用未定义的类   'CFGFile :: Setting'“

编译时。

我正在使用Visual Studio 2017。

在C ++中的嵌套类中不能进行交叉引用吗?

3 个答案:

答案 0 :(得分:5)

这与nested无关。在C ++中,您不能像这样相互交叉引用两个类/结构。解决方法是您使用不需要完整类型定义的指针或引用。对于您的情况,请尝试以下操作,

class CFGFile
{
  class Setting;

  class Entry
  {
    Setting* Setg;  // or std::unique_ptr<Setting> Setg;
  };

  class Setting
  {
    Entry Ent;
  };
};

@Ted Lyngmo建议,std::unique_ptr是现代C ++中应用程序的首选方式。

答案 1 :(得分:0)

要进一步解释为什么会发生这种情况,这是由于以下事实:编译器查看结构或类时,它需要能够确定其确切大小,此外还可以知道它需要多少内存。分配这些实例。

在这种情况下,编译器无法确定Entry的大小,因为它仅知道存在Setting类,但尚不知道其大小。

使用指针,即:

class Setting;

class Entry
{
    Setting* Setg;
};

实际上可以解决此问题,因为尽管编译器仍然对Setting一无所知,但编译器仍然知道指针的大小(无论指针的类型如何)。

如上所述,“嵌套”部分对此没有影响。

答案 2 :(得分:0)

C#(根据设计)使用类的引用语义,因此提供的代码段不会引起循环值依赖。 OTH c ++更喜欢使用值语义,如果标准不禁止这种代码的话,这将导致原始示例代码中的无限递归。如先前答复中所暗示的,如果需要引用语义,则应以指针/引用语法的形式明确表示它。