我不知道我的标题是否用正确的术语表示,如果不是,请更正我,以便我进行更新。但是,这是我用代码示例表达的问题:示例A和B之间的keyStates变量有什么区别?
示例A(其中“ keyStates”变量在.h文件的类中定义为静态变量):
// Input.h
class Input
{
public:
static bool GetKeyDown(KeyCode keycode);
private:
static std::unordered_map<KeyCode, KeyState> keyStates;
}
// Input.cpp
#include "Input.h"
bool Input::GetKeyPressed(KeyCode keyCode)
{
for (auto Code : AllKeyCodes)
{
if (Code == keyCode)
{
return KeyState::PRESSED == keyStates.find(Code)->second;
}
}
return false;
}
示例B(其中在.cpp文件中定义了“ keyStates”变量而没有静态变量的情况):
// Input.h
class Input
{
public:
static bool GetKeyDown(KeyCode keycode);
}
// Input.cpp
#include "Input.h"
std::unordered_map<KeyCode, KeyState> keyStates;
bool Input::GetKeyPressed(KeyCode keyCode)
{
for (auto Code : AllKeyCodes)
{
if (Code == keyCode)
{
return KeyState::PRESSED == keys.find(Code)->second;
}
}
return false;
}
好吧,当您有一个类的静态成员(无论是字段还是方法)时,对于整个类而言,它是“全局”的,因此:
ClassName::method()
或ClassName::field
。this
这种方法使用完整的限制列表在这里:https : //en.cppreference.com/w/cpp/language/static另一方面,静态全局变量类似于通常的全局变量,只是它仅对于当前编译单元“存在”。除了此特定的.cpp文件,您不能在任何地方使用它。对于普通的全局变量,如果有两个具有相同全局变量的编译单元(cpp文件)int a
,则代码将无法编译。这方面的更多信息:C / C ++全局vs静态全局
另外,您可以在任何使用静态全局变量(或方法,甚至类型)的地方使用匿名名称空间。
UPD:这里还有另一个区别。当您将keyStates
cpp文件作为静态全局变量(或匿名命名空间的一部分)放入cpp文件时,实现细节将从类定义和.h文件中隐藏。因此,只要您不希望更改接口并不得不重新编译除cpp文件以外的任何内容,就可以进行更改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句