对静态成员进行未定义的引用意味着什么?

对静态成员进行未定义的引用意味着什么?

我刚刚写了一个包含一些静态数据成员的类,但现在我收到有关“未定义引用”的错误。为什么这不起作用?我究竟做错了什么?


鸿蒙传说
浏览 2066回答 2
2回答

回首忆惘然

考虑以下课程://In&nbsp;header&nbsp;fileclass&nbsp;Example&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;bool&nbsp;exampleStaticMember;};在这里,exampleStaticMember声明但未定义。这意味着如果exampleStaticMember以一种意味着它必须具有地址的方式使用,那么必须有一个单独的定义。通常,类定义中的静态数据成员的声明不是该成员的定义。所需的声明通常放在cpp文件中,该文件包含该类成员的其他定义。它必须与类定义位于同一名称空间中。该定义通常如下所示://In&nbsp;source&nbsp;file://This&nbsp;may&nbsp;optionally&nbsp;have&nbsp;an&nbsp;initialiser&nbsp;(eg&nbsp;"=&nbsp;true")bool&nbsp;Example::exampleStaticMember;该定义可以放在任何cpp文件中,但不应该放在带有类的头文件中,因为这可能会破坏一个定义规则。作为一种特殊情况,如果静态成员变量是const整数或枚举类型,那么它可以在类定义中具有初始化://In&nbsp;header&nbsp;fileclass&nbsp;Example&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;const&nbsp;int&nbsp;initialised&nbsp;=&nbsp;15;};在这种情况下,仍然需要cpp文件中的定义,但不允许使用初始化器://In&nbsp;source&nbsp;file//Note:&nbsp;no&nbsp;initialiser!const&nbsp;int&nbsp;Example::initialised;已经初始化的静态成员可以在常量表达式中使用。模板对于模板的静态数据成员,情况略有不同。应该在标题中定义静态成员以及类的其余部分://In&nbsp;header&nbsp;filetemplate<typename&nbsp;T>class&nbsp;Example&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;int&nbsp;exampleInt; &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;T&nbsp;exampleT;}template<typename&nbsp;T>&nbsp;int&nbsp;Example<T>::exampleInt;template<typename&nbsp;T>&nbsp;T&nbsp;Example<T>::exampleT;这是有效的,因为类模板的静态数据成员的One Definition Rule存在特定的例外。静电的其他用途当static关键字应用于不在类范围内的函数和对象时,它可以具有非常不同的含义。当应用于函数作用域中的对象时,它声明一个在函数的第一次执行中初始化的对象,并随后在函数调用之间保持其值。当应用于命名空间作用域(在任何类或函数定义之外)的对象或函数时,它声明具有内部链接的对象或函数。对于对象,不推荐使用此用法,因为unnamed-namespace提供了更好的替代方法。

阿晨1998

您必须实例化.cpp文件中标头中定义的静态成员。例如:// foo.hclass foo {&nbsp; &nbsp; static int X;};// foo.cpp#include "foo.h"int foo::X = 0;
打开App,查看更多内容
随时随地看视频慕课网APP