5

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;
}

它给出了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) {}
};
4

1 回答 1

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;
}

Inner模板内部是一个依赖类型,因此当您在成员或任何其他上下文中定义实例时,它不需要是完整的。它只需要在实例化发生后完成,在这种情况下从main.

我想不出这样做的充分理由,但确实如此。

为了程序组织,不应使用嵌套类。嵌套暗示了一种概念依赖,“内部不能存在,除非在外部提供的上下文中”。例如,虽然容器节点类嵌套在容器中很常见,但这可能会导致问题。SCARY 成语是一种拒绝这种组织并获得改进的通用性的设计风格。

TL;DR:独立定义两个类并将它们与嵌套的typedef.

于 2013-11-21T00:31:03.803 回答