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

时间:2013-11-21 00:20:08

标签: c++ nested inner-classes nested-class outer-classes

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'

为什么破坏的代码不会产生与InnerOuter定义中定义的版本相同的效果,如下面的工作代码所示?

struct Outer
{
    struct Inner
    {
        Inner(int n) : num(n) {}
        int num;
    } myinner;
    Outer() : myinner(2) {}
};

1 个答案:

答案 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链接它们。