外部类的嵌套类定义,而外部类包含内部类的实例
Nested class definition outside outer class's, while outer class contains instance of inner class
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;
}
给出了VC11中的错误CCD_ 1。
为什么断开的代码没有与Outer
的定义中定义Inner
的版本等效的效果,就像下面的工作代码一样?
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
将它们链接起来。
相关文章:
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- 如何声明由多个线程调用的 C++ DLL 的内部类,而无需导出类
- 从内部类继承
- 如何将枚举类转发声明为模板化类的内部类?
- 从内部类中的方法从包含类调用方法
- 从模板化父类中的派生内部类访问受保护的成员变量
- C++模板类的内部类访问
- 使用类模板的内部类模板专用化模板
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- C++ 如何在外部类中声明的内部类中使用变量
- 在C++中将内部类实现为具有名称空间的独立类有什么好处
- 参数化类的别名(或类型定义)内部类
- 从内部类的析构函数调用虚拟函数
- 如何在没有setter的情况下设置类内部类的成员变量?
- 具有相同名称的方法和内部类(错误:.. 与前面的声明冲突)
- 内部类私有成员访问和封闭的友好性
- 在C++中从内部类对象获取外部类对象
- 从内部类访问外部公共成员
- 如果内部类具有与外部类同名的函数,那么它是否在 C++ 和 Java 中隐藏了覆盖或重载
- 模板类外部的内部类方法定义