为什么一个类允许拥有自身的静态成员,却不允许非静态成员?

27
class base {
public:
    base a;
};

这会导致编译错误。

class base {
public:
    static base a;
};

尽管这段代码没有引起编译错误


8
结构体a { static a b; } a::b; 的意思是在结构体a中定义了一个名为b的静态成员变量,并在代码的最后一行进行了定义。 - Johannes Schaub - litb
2
@JohannesSchaub-litb 你刚刚让我头疼了 o_O - BЈовић
6
翻译:嘿,听说你喜欢班级... - Matthew
2个回答

42
因为 static 类成员不存储在类实例中,所以 static 可行。
将对象存储在同一类型的另一个对象中会导致运行时出错 - 无限大小,对吗? sizeof 应该返回什么?编译器需要知道对象的大小,但由于它包含一个相同类型的对象,这是没有意义的。

6
我猜测错误可能是这样的:
“字段‘a’具有不完整的类型”
这是因为在非静态情况下,只有在括号关闭后,类A才会被完全定义。另一方面,静态成员变量需要在类完全定义后进行单独的定义步骤,这就是为什么它们能够工作的原因。
搜索“声明”和“定义”的区别以获得更彻底的解释。

编译器不能类似于“设置提醒”来“稍后添加”吗?有什么限制吗? - Assaf Levy
2
@AssafLevy 这个对象的大小会是多少呢?Base 包含一个 Base,而这个 Base 又包含了一个 Base... - James Kanze
3
有点像两面相互对着的镜子.. 明白了,谢谢! - Assaf Levy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接