外部类的嵌套类定义,而外部类包含内部类的实例

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)

Pot*_*ter 6

这是一个危险信号,但您可以使用假模板来做到这一点。

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.