据IBM C++知识中心的C++说:
类的成员列表中静态数据成员的声明不是定义。必须在名称空间范围内在类声明之外定义静态成员。
为什么会这样呢?关于内存分配的原理图是什么?
发布于 2013-09-11 19:03:35
这是语言的一条规则,被称为“一个定义规则”。在程序中,每个静态对象(如果使用的话)必须定义一次,而且只能定义一次。
类定义通常位于头文件中,包含在多个翻译单元中(即来自多个源文件)。如果标头中的静态对象声明是一个定义,那么您将得到多个定义,每个单元中都包含一个定义,这将违反规则。因此,它不是一个定义,您必须在其他地方提供一个定义。
原则上,语言可以做它对内联函数所做的事情,允许将多个定义合并到一个定义中。但事实并非如此,所以我们必须遵守这条规则。
发布于 2013-09-11 19:00:18
这根本不是内存分配的问题。它是关于在一个链接的编译单元中有一个定义点。@Nick也指出了这一点。
来自Bjarne的网站Faq2.html#
类通常在头文件中声明,而头文件通常包含在许多翻译单元中。然而,为了避免复杂的链接器规则,C++要求每个对象都有一个唯一的定义。如果C++允许在类中定义需要作为对象存储在内存中的实体,则该规则将被打破。
发布于 2018-04-03 18:48:35
从C++17开始,您现在可以在类中定义静态数据成员。请参阅优先选择
静态数据成员可以内联声明。可以在类定义中定义内联静态数据成员,并且可以指定初始化器。它不需要一个阶级之外的定义: 结构X{内联静态整数n= 1;};
https://stackoverflow.com/questions/18749071
复制相似问题