C ++: статические функции-члены и переменные - переопределение статической переменной?

StackOverflow https://stackoverflow.com/questions/1817445

Вопрос

Я пытался включить шаблон разработки 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()
{
}

Используйте макрос защиты заголовка для задачи переопределения и явно определите свой частный конструктор.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top