Cpp.中的私有静态数据成员只能在其定义时初始化,而类内初始化无效

Private static data member in Cpp.. can only be initialized at its definition, yet invalid in-class initialization?

本文关键字:初始化 定义 无效 静态 数据成员 Cpp      更新时间:2023-10-16

头文件中初始化时,我收到以下错误:

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 文件中。