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(使用前将#替换为@)