В чем разница между объявлением переменной stati c в классе в файле .h и «глобальной» переменной в файле. cpp - PullRequest
1 голос
/ 11 июля 2020

Я не знаю, правильно ли выражен мой заголовок, если нет, поправьте меня, чтобы я мог его обновить. Однако это мой вопрос, выраженный примерами кода: в чем разница, когда дело доходит до переменной keyStates, между примерами A и B?

Пример A (где переменная «keyStates» определяется как stati c переменная в классе в файле .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 (где переменная keyStates определена без stati c в файле. cpp):

// 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;
}

1 Ответ

1 голос
/ 11 июля 2020

Что ж, когда у вас есть член c класса (будь то поле или метод), он является «глобальным» для всего класса, так что:

  1. To получить доступ к нему из любого места, где вам нужно использовать ClassName::method() или ClassName::field.
  2. Вы можете предоставить или ограничить доступ к этому члену с помощью модификаторов доступа: private, publi c и ptorected.
  3. Этот член принадлежит классу, а не каким-либо конкретным c объектам. Вы не можете использовать this из таких методов. Полный список ограничений есть: https://en.cppreference.com/w/cpp/language/static

Глобальная переменная stati c, напротив, похожа на обычная глобальная переменная, кроме , она «существует» только для текущей единицы компиляции. Вы не можете использовать его нигде, кроме этого конкретного файла. cpp. С обычной глобальной переменной, если есть две единицы компиляции (cpp файлов) с одной и той же глобальной переменной int a, код не будет компилироваться. Подробнее об этом: C / C ++ global vs stati c global

Кроме того, вы можете использовать анонимные пространства имен везде, где вы бы использовали глобальные переменные stati c (или методы, или даже типы).

UPD .: Еще одно отличие здесь. Когда вы помещаете свой keyStates в cpp файл как stati c global (или часть анонимного пространства имен), детали реализации скрываются из определения класса и файла .h. Таким образом, вы можете изменить его всякий раз, когда будете sh без изменения интерфейса и необходимости перекомпилировать что-либо, кроме файла cpp.

...