Cpp.中的私有静态数据成员只能在其定义时初始化,而类内初始化无效
Private static data member in Cpp.. can only be initialized at its definition, yet invalid in-class initialization?
在
头文件中初始化时,我收到以下错误:
invalid in-class initialization of static data member of non-integral type 'bool [8]'
如果我尝试在.cpp中初始化,我会得到:
'bool Ion::KeyboardInput::key [8]' is a static data member; it can only be initialized at its definition
这是标题:
enum MYKEYS {
KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_W, KEY_S, KEY_A, KEY_D
};
class KeyboardInput
{
public:
KeyboardInput();
~KeyboardInput();
static void getKeysDown(ALLEGRO_EVENT ev);
static void getKeysUp(ALLEGRO_EVENT ev);
static bool getKey(int keyChoice);
private:
static bool key[8] = {false, false, false, false, false, false, false, false};
};
第一条错误消息通知您初始化头文件中的静态成员变量不正确。第二条错误消息表示您尝试初始化构造函数中的静态成员key
。
静态类成员变量需要在类内部声明(不初始化),然后在.cpp
文件中在类外部定义(有点像全局变量,只是变量名中包含类名)。
bool KeyboardInput::key[8];
变量的定义可以包括初始值设定项。由于您将其初始化为全部 false,因此.cpp
文件中的上述定义就足够了。
静态类成员变量与全局变量没有太大区别,只是它的作用域是类名,并且可以保护为只有类的成员(带private
)、类的直接子类(带protected
)或类的友元才能访问。
您必须在 .h 文件中声明静态数据,并在.cpp文件中为其赋值。像这样的东西,
_header.h
class KeyBoardInput{
public:
KeyboardInput();
....
private:
static bool key[8];
};
_header.cpp
#include<"_header.h">
bool KeyBoardInput::key[8] = {false, false, false, false, false, false, false, false};
除了在 cpp 文件中,您不能在任何地方初始化静态变量......它不属于特定对象。因此,您必须在类外部(在 cpp 文件中)进行初始化,以便所有对象都可以共享它。
试试这个:
enum MYKEYS {
KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_W, KEY_S, KEY_A, KEY_D
};
class KeyboardInput
{
public:
KeyboardInput();
~KeyboardInput();
static void getKeysDown(ALLEGRO_EVENT ev);
static void getKeysUp(ALLEGRO_EVENT ev);
static bool getKey(int keyChoice);
private:
static bool key[8];
};
bool KeyboardInput::key = {false, false, false, false, false, false, false, false};
最后一行实际上应该放在.cpp文件中,因为所有"代码"都应该放在 cpp 文件中。
相关文章:
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- Boost Python Numpy - 要初始化的未定义引用
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- C++类中的类作为自定义向量(如何初始化?
- 初始化类定义中的结构数组
- C++ 如何检查 char 变量是否未定义(未初始化)
- C++列表初始化允许多个用户定义的转换
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- (C++)我的自定义数组无法初始化(编译错误)
- 类模板静态数据成员定义/声明/初始化
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 在另一个文件中初始化的 extern 数组中未定义的引用
- thread_local静态成员模板定义:初始化失败,GCC
- 通过用户定义的转换初始化引用
- 使用无效指针初始化指针声明符的行为是否未定义?
- 您可以在类初始化器列表中定义数组大小吗?
- 如何使用自定义比较器初始化类数据成员,该成员是 std::set
- 获取未初始化对象成员的地址是否定义良好?
- 初始化自定义类型构造函数的数组
- 使用用户定义的构造函数初始化C++结构