关于C++具有自我参考的类
About C++ classes with self reference
我有点困惑...
为什么在C++允许这样做:
static int t = 0;
class A
{
public:
A() : m(t++)
{
cout << "C:" << m << endl;
if(t >= 5)
{
A a; // <<<< ----- THIS line
throw( a);
}
}
int m;
};
但这不是:
static int t = 0;
class A
{
public:
A() : m(t++)
{
cout << "C:" << m << endl;
}
A a; // <<<< ----- THIS line
int m;
};
第二个没有按预期编译(是的,我知道为什么它没有编译:在代码的这一点上,A
仍然不完整(......
但。。。第一个编译得很好(并做了它应该做的事情,即:在语句上使应用程序崩溃:A a[10];
(。构造函数中的A
是完整类型吗?还可以为我指出一些针对这种情况C++标准条目吗?
当你声明任何变量时,编译器应该知道它的大小。 在第二个示例中,您将在A
内部创建一个A
对象,因此编译器将无法计算A
的大小来分配内存。
还可以为我指出一些C++这种情况的标准条目吗?
是的,C++标准草案说,直到结束}
才完全定义类,这是在第9.2
类成员第2段中:
类在类说明符的结尾 } 处被视为完全定义的对象类型 (3.9((或完整类型(。[...]
并且类的所有非静态数据成员必须是完整的,来自第 9 段:
非静态 (9.4( 数据成员不得具有不完整的类型。特别是,类 C 不应包含类 C 的非静态成员,但它可以包含指向类 C 对象的指针或引用。
但它在构造函数中也被认为是完整的,在第 2 段中也是如此:
[...]在类成员规范中,类在函数体、默认参数、[...]
尽管静态成员可能不完整,但第 9.4.2
节静态数据成员第 2 段:
静态数据成员在其类定义中的声明不是定义,并且可能属于 cv 限定的 void 以外的不完整类型。[...]
不允许类包含自身也是有意义的,因为这需要无限的空间,因为自引用永远不会结束,A
包含包含A
的A
......
相关文章:
- C++错误消息*成员参考.**初学者*
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 参考资源文件VC++中的$(SolutionDir)
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 为什么在运算符重载时需要参考?
- 使 \page 和 \subpage 参考 doxygen 中的方法文档
- std::shared_ptr 自定义参考计数器
- 英特尔 TBB 程序不会终止,可能会误用参考计数器
- 这个SSDO演示的GLSL版本要求是自我冲突的吗
- 避免在基于反向范围的for循环实现中悬挂参考
- 通用参考 l 值不复制对象
- 标准::enable_if和通用参考的使用差异
- 标准::积累参考?
- C++丢失了参考
- 施工中的自我参考
- 没有对象或结构的自我参考Typedef
- 如何使用自我参考类型并在C 类中使用别名
- C 通过传递的参考来修改自我
- 课堂自我参考问题
- 关于C++具有自我参考的类