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

2024-04-07

C++

如何将内部(嵌套)类的定义放在其外部(封闭)类的定义之外,其中外部类至少有一个内部类实例作为数据成员?我搜索了但我找到的最相关的答案,源文件中的嵌套类定义 https://stackoverflow.com/questions/4482005/nested-class-definition-in-source-file/4482013#4482013,没有外部类具有内部对象作为数据成员的示例。我遵循了这个答案,就在外部类的定义中声明但不定义内部类而言,但我的代码仍然损坏:

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

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

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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌套类定义在外部类之外,而外部类包含内部类的实例 的相关文章