C ++
如何将内部(嵌套)类的定义放在其外部(封闭)类的定义之外,其中外部类至少有一个内部类的实例作为数据成员?我搜索了但是我找到的最相关的SO答案Nested Class Definition in source file没有一个示例,其中外部类具有内部对象作为数据成员。我遵循了这个答案,就声明但没有定义外部类定义中的内部类而言,但是我的代码仍然被破坏了:
struct Outer
{
struct Inner;
Inner myinner;
Outer() : myinner(2) {}
};
struct Outer::Inner
{
Inner(int n) : num(n) {}
int num;
};
int main()
{
Outer myouter;
}
它在VC11中给出错误error C2079: 'Outer::myinner' uses undefined struct 'Outer::Inner'
。
为什么破坏的代码不会产生与Inner
在Outer
定义中定义的版本相同的效果,如下面的工作代码所示?
struct Outer
{
struct Inner
{
Inner(int n) : num(n) {}
int num;
} myinner;
Outer() : myinner(2) {}
};
答案 0 :(得分:4)
这是一个红旗,但您可以使用虚假模板。
template< typename = void >
struct Outer_temp
{
struct Inner;
Inner myinner;
Outer_temp() : myinner(2) {}
};
typedef Outer_temp<> Outer; // Hide template from user.
template< typename v >
struct Outer_temp< v >::Inner
{
Inner(int n) : num(n) {}
int num;
};
int main()
{
Outer myouter;
}
模板中的 Inner
是依赖类型,因此在成员或任何其他上下文中定义实例时不需要完整。它只需要在实例化发生后完成,在本例中来自main
。
我无法想象有这么好的理由,但确实如此。
不应该为程序组织使用嵌套类。嵌套表明了概念上的依赖,“除了Outer提供的上下文之外,内部不可能存在”。例如,虽然通常将容器节点类嵌套在容器中,但这可能会导致问题。 SCARY习语是一种设计风格,它拒绝这种组织并获得更好的通用性。
TL; DR:独立定义两个类,并用嵌套的typedef
链接它们。