我刚写了一个带有一些静态数据成员的类,但现在我收到了关于“未定义引用”的错误。为什么会这样?我做错了什么吗?
//In header file
class Example {
static bool exampleStaticMember;
};
exampleStaticMember
但未定义。这意味着,如果以某种方式使用exampleStaticMember
,使其必须具有地址,则必须有单独的定义。一般来说,在类定义中静态数据成员的任何声明都不是该成员的定义。//In source file:
//This may optionally have an initialiser (eg "= true")
bool Example::exampleStaticMember;
//In header file
class Example {
static const int initialised = 15;
};
//In source file
//Note: no initialiser!
const int Example::initialised;
这样初始化的静态成员可以在常量表达式中使用。
模板
对于模板的静态数据成员,情况略有不同。静态成员应该与类的其余部分一起在头文件中定义:
//In header file
template<typename T>
class Example {
static int exampleInt;
static T exampleT;
}
template<typename T> int Example<T>::exampleInt;
template<typename T> T Example<T>::exampleT;
class Example;
)。通过“定义”,我指的是声明类成员的代码。(是的,这些成员本身可以在类定义之外定义,但这在这里并不重要)。 - Mankarse在.cpp文件中,你需要实例化在头文件中定义的静态成员。例如:
// foo.h
class foo {
static int X;
};
// foo.cpp
#include "foo.h"
int foo::X = 0;