【问题标题】:C++ nested classes referencing each otherC++ 嵌套类相互引用
【发布时间】:2018-11-21 14:26:16
【问题描述】:

在 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++ 的嵌套类中不能交叉引用吗?

【问题讨论】:

  • 在 C# 中尝试使用 struct 而不是 class,这应该是一个公平的比较。也不应该工作。
  • @tkausl 因为在上面的 C# 示例中,定义了对对象的引用,而不是类类型的对象。我得到它。谢谢!
  • 值不能是NULL,所以你写的是一个Entry,其中包含一个Setting,而Entry又包含一个Setting,而Setting又包含一个@ 987654328@.... 无限

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


【解决方案1】:

这与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++ 应用程序的首选方式。

【讨论】:

  • 或许建议使用std::unique_ptr&lt;Setting&gt; Setg; 会很好。
【解决方案2】:

为了解释为什么会发生这种情况,这是因为当编译器查看一个结构或类时,它需要能够确定它的确切大小,除此之外,它还需要能够知道它需要多少内存为这些实例分配。

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

使用指针,即:

class Setting;

class Entry
{
    Setting* Setg;
};

实际上解决了这个问题,因为虽然编译器仍然不知道Setting,但它仍然知道指针的大小(不管指针的类型)。

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

【讨论】:

    【解决方案3】:

    C# - 按照设计 - 使用类的引用语义,因此提供的 sn-p 不会导致循环值依赖。 OTH c++ 更喜欢值语义,如果标准没有禁止这种代码,这反过来会导致原始示例代码中的无限递归;正如之前的回复所暗示的,如果需要引用语义,则应该用指针/引用语法明确表示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 2023-03-23
      相关资源
      最近更新 更多