C ++: статические функции-члены и переменные - переопределение статической переменной?
-
08-07-2019 - |
Вопрос
Я пытался включить шаблон разработки Singleton в свой код, но у меня появилась странная ошибка:
main.obj : error LNK2005: "private: static class gameState * gameState::state" (?state@gameState@@0PAV1@A) already defined in gameState.obj
Если вы не знакомы с одноэлементным шаблоном, он в основном используется для принудительного применения только 1 экземпляра определенного объекта во всей программе. Вот соответствующий код: gameState.h:
class gameState
{
public:
static gameState* Instance() {return state;}
.
.
.
private:
gameState();
static gameState* state;
};
gameState* gameState::state = new gameState();
и сейчас я просто использую экземпляр этого объекта в файле main.cpp:
gameState *currState = gameState::Instance();
.
.
.
for_each(currState->getHumanPieces().begin(),currState->getHumanPieces().end(), drawPieces);
Казалось бы, я пытаюсь переопределить gameState :: state, но не могу понять, почему ... помогать кому-либо?
это решило эту проблему, но осталась одна ошибка, которую я раньше не публиковал, так как считал, что это просто часть другой:
error LNK2019: unresolved external symbol "private: __thiscall gameState::gameState(void)" (??0gameState@@AAE@XZ) referenced in function "void __cdecl `dynamic initializer for 'private: static class gameState * gameState::state''(void)" (??__E?state@gameState@@0PAV1@A@@YAXXZ)
Хороший совет, как это исправить?
Спасибо вам обоим, это исправлено: D
Решение
Вам нужно поместить определение статического gameState *
точно в один исходный файл, то есть в эту строку:
gameState* gameState::state = new gameState();
Если вы поместите его в заголовок, который включен в несколько исходных файлов, у каждого есть определение gameState :: state
, которое приводит к ошибкам во время соединения.
Для решения последующей проблемы используйте совет Vadakkumpadaths : вам нужно предоставить определение для конструктора gameState
, а не только объявление.
Другие советы
Добавьте определение для вашего конструктора, чтобы исправить ошибку второго компоновщика.
private:
gameState()
{
}
Используйте макрос защиты заголовка для задачи переопределения и явно определите свой частный конструктор.