Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;相互引用的嵌套类_C++_Class_Nested_Visual Studio 2017 - Fatal编程技术网

C++ C++;相互引用的嵌套类

C++ C++;相互引用的嵌套类,c++,class,nested,visual-studio-2017,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; }; cla

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

这与<代码>嵌套< /COD>无关。在C++中,不能为这样的两个类/结构交叉引用。解决方法是使用不需要完整类型定义的指针或引用。在您的情况下,请尝试以下操作:

class CFGFile
{
  class Setting;

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

  class Setting
  {
    Entry Ent;
  };
};
类CFGFile
{
班级设置;
班级报名
{
设置*Setg;//或std::unique\u ptr Setg;
};
班级设置
{
入境事务处;
};
};

如Ted Lyngmo所建议的, STD::UnjyQupPTR/COD>是现代C++应用程序的首选方式。

< P>扩展为什么会发生这种情况,这是因为当编译器查看结构或类时,它需要能够确定其确切大小,除此之外,我们还需要知道需要为这些实例分配多少内存

在这种情况下,编译器无法确定
条目的大小,因为它只知道
设置
类存在,但还不知道其大小

使用指针,即:

class Setting;

class Entry
{
    Setting* Setg;
};
实际上解决了这个问题,因为虽然编译器仍然不知道有关
设置的任何信息,但它仍然知道指针的大小(不管指针对象的类型如何)


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

C#-按设计-对类使用引用语义,因此提供的代码段不会导致循环值依赖性。OTC++更喜欢值语义,如果标准没有禁止这种代码,那么它会导致原始样本代码中无限递归;正如前面的回复中所暗示的,如果需要引用语义,则应该用指针/引用语法显式表示

在C#中尝试使用struct而不是class,这应该是一个公平的比较。也不应该起作用。@tkausl因为在上面的C#示例中,正在定义对对象的引用,而不是类类型的对象。我明白了。谢谢值不能为
NULL
,因此您编写的是一个
条目
,其中包含一个
设置
,该设置又包含一个
条目
。。。。ad infinitumPerhaps建议使用
std::unique\u ptr Setg就好了。