Я пытаюсь написать одноэлементный класс для централизованной точки доступа к игровым данным из различных классов. Вот что у меня есть ... пока что общее.
-> Синглтон.h
#pragma once
class Singleton {
public:
static Singleton* instance;
static Singleton* Get();
private:
Singleton() {};
};
Singleton* Singleton::Get() {
instance = new Singleton();
return instance;
}
-> и в main.cpp я пытаюсь вызвать к существованию класс Singleton
#include "Singleton.h"
Singleton* single = Singleton::Get();
-> и я получаю следующие ошибки в MS Visual Studio
Неразрешенный внешний символ LNK2001 «общедоступный: статический класс Singleton * Singleton :: instance» (? Instance @ Singleton @@ 2PAV1 @ A) TimePilot84 E: \ VC \ TimePilot84 \ TimePilot84 \ main.obj 1
Я не понимаю, как создать экземпляр этого класса, если его конструктор является частным и если доступ к общедоступному конструктору открыт, но дает ошибку
Я понимаю, что я не проверяю, существует ли класс перед вызовом конструктора в функции Get, и что у меня пока нет деструкторов.
Я делаю только один вызов этой функции в main, и она не будет компилироваться. Спасибо за вашу помощь.





Вы должны определить член static. Это нужно делать в файле .cpp, а не в заголовке:
Singleton *Singleton::instance = nullptr;
Также обратите внимание, что экземпляр должен быть создан только один раз, поэтому Get() должен выглядеть так:
Singleton *Singleton::Get()
{
if (!instance)
{
instance = new Singleton;
}
return instance;
}
В качестве альтернативы вы можете отказаться от переменной-члена static и реализовать Get() следующим образом:
Singleton *Singleton::Get()
{
static Singleton instance;
return &instance;
}
Последний имеет дополнительный эффект вызова Singleton :: ~ Singleton () при выходе из вашей программы.
Отлично спасибо. Это не позволило мне определить статический член в заголовке. Я пробовал оба метода, как вы писали, и они оба работали. В итоге я использовал последний, намного чище.
Вам необходимо определить экземпляр статической переменной. После объявления класса добавьте следующее:
Singleton* Singleton::instance = nullptr;
Обычно рекомендуемый подход к Singleton: stackoverflow.com/a/1008289/3807729