Cod*_*cks 5 c++ nested nested-class inner-classes outer-classes
C++
如何将内部(嵌套)类的定义置于其外部(封闭)类的定义之外,其中外部类至少有一个内部类实例作为数据成员?我搜索了但我找到的最相关的 SO 答案,源文件中的嵌套类定义,没有一个示例,其中外部类将内部对象作为数据成员。我遵循了那个答案,就在外部类的定义中声明但未定义内部类而言,但我的代码仍然被破坏:
struct Outer
{
struct Inner;
Inner myinner;
Outer() : myinner(2) {}
};
struct Outer::Inner
{
Inner(int n) : num(n) {}
int num;
};
int main()
{
Outer myouter;
}
Run Code Online (Sandbox Code Playgroud)
它给出了error C2079: 'Outer::myinner' uses undefined struct 'Outer::Inner'VC11 中的错误。
为什么损坏的代码没有与在Inner的定义中定义的版本等效的效果Outer,就像下面的工作代码一样?
struct Outer
{
struct Inner
{
Inner(int n) : num(n) {}
int num;
} myinner;
Outer() : myinner(2) {}
};
Run Code Online (Sandbox Code Playgroud)
这是一个危险信号,但您可以使用假模板来做到这一点。
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;
}
Run Code Online (Sandbox Code Playgroud)
Inner模板内部是一个依赖类型,因此当您在成员或任何其他上下文中定义实例时,它不需要是完整的。它只需要在实例化发生后完成,在这种情况下从main.
我无法想象这样做的充分理由,但就是这样。
不应为了程序组织而使用嵌套类。嵌套暗示了一个概念上的依赖,“除非在外部提供的上下文中,否则内部不能存在。” 例如,尽管容器节点类嵌套在容器中很常见,但这可能会导致问题。SCARY 成语是一种拒绝这种组织并获得改进的通用性的设计风格。
TL;DR:独立定义两个类并将它们与嵌套的typedef.