Проблемы с доступом к одноэлементному классу C++

Я пытаюсь написать одноэлементный класс для централизованной точки доступа к игровым данным из различных классов. Вот что у меня есть ... пока что общее.

-> Синглтон.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, и она не будет компилироваться. Спасибо за вашу помощь.

Обычно рекомендуемый подход к Singleton: stackoverflow.com/a/1008289/3807729

Galik 31.05.2018 05:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
61
2

Ответы 2

Вы должны определить член 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 () при выходе из вашей программы.

Отлично спасибо. Это не позволило мне определить статический член в заголовке. Я пробовал оба метода, как вы писали, и они оба работали. В итоге я использовал последний, намного чище.

Tim 31.05.2018 19:18

Вам необходимо определить экземпляр статической переменной. После объявления класса добавьте следующее:

Singleton* Singleton::instance = nullptr;

Другие вопросы по теме