2016-01-21 3 views
0

Я нашел эту реализацию Singleton. Как я могу сделать указатель или общий указатель на это? `(Shared) Указатель на Singelton

И почему это не работает? auto test = Singleton :: Instance();

class Singleton 
{ 
public: 
static Singleton & Instance() 
{ 
    static Singleton myInstance; 
    return myInstance; 
} 

// delete copy and move constructors and assign operators 
Singleton(Singleton const&) = delete;    // Copy construct 
Singleton(Singleton&&) = delete;     // Move construct 
Singleton& operator=(Singleton const&) = delete; // Copy assign 
Singleton& operator=(Singleton &&) = delete;  // Move assign 

// Any other public methods 

protected: 
Singleton() 
{ 
} 

~Singleton() 
{ 
} 

// And any other protected methods. 
}; 
+1

Зачем вам нужен общий указатель в этом случае? Звучит так, что вы пытаетесь решить проблему XY. Тестовый код может быть исправлен с использованием ссылки: 'auto & test = Singleton :: Instance();'. –

ответ

1

И почему это не работает? auto test = Singleton :: Instance();

Если вы посмотрите на ошибку компиляции, это скажет вам.

main.cpp:31:37: error: use of deleted function 'Singleton::Singleton(const Singleton&)' 

Вы пытаетесь скопировать объект. Но конструктор копирования удаляется, и поэтому тип не копируется.

Вы, вероятно, намеревался сделать ссылку вместо копии:

auto& test = Singleton::Instance(); 

Как я могу сделать указатель ... на это?

Вы можете присвоить указатель на синглтон, взяв его адрес с адресом-оператора:

auto* test = &Singleton::Instance(); 

или общий указатель

Вы не можете иметь общие указатели объекты со статическим хранилищем - если вы не используете специальный дебетер, но такой общий указатель малопригодно. Поскольку ваш singleton имеет статическое хранилище, вы не захотите использовать общий указатель. Вы можете изменить свой синглтон, чтобы сохранить статически сохраненный общий указатель на динамически выделенный объект. Тогда у вас может быть общий указатель.

+0

, вы захотите дать shared_ptr нуль-deleter –

+0

Ah - отлично. Имеют смысл. Спасибо большое :) Это хороший способ сделать Singleton? – Waterplant

+0

Невозможно удалить объект вручную - не так ли? Или есть какой-то способ? – Waterplant

0

Почему бы не использовать общий указатель в качестве члена класса и не вернуть его?

Таким образом, вы должны были бы

shared_ptr<Singleton> Instance() 
{ 
    if(!myInstance) 
    { 
     myInstance.reset(new Singleton()); 
    } 

    return myInstance; 
} 

private: 
    shared_ptr<Singleton> myInstance; 
+0

Я пробовал - но я получаю сообщение: «не может получить доступ к закрытому члену, объявленному в классе» – Waterplant

0

сырого указатель: Singleton* ptr = &Singleton::Instance(); или auto ptr = &Singleton::Instance();

Ссылки: Singleton& ref = Singleton::Instance(); или auto& ref = Singleton::Instance();

Вы не должны использовать общие указатели (как вы не владеете одноплодными объект). Не без изменения одноэлементного класса соответственно.


Почему yoour код не работает: auto дедуцирует типа, чтобы быть типом значения и пытается скопировать результат instance(). Поскольку Singleton невозможен, это терпит неудачу.

Смежные вопросы