在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 ++中的嵌套类中不能进行交叉引用吗?
答案 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 ++更喜欢使用值语义,如果标准不禁止这种代码的话,这将导致原始示例代码中的无限递归。如先前答复中所暗示的,如果需要引用语义,则应以指针/引用语法的形式明确表示它。