Udostępnione wskaźniki do singletonu nie rozpoznają się nawzajem

Obecnie uczę się używać inteligentnych wskaźników C ++ 11 podczas programowania silnika gry 2D jako hobby za pomocą SDL. Wystąpił jednak problem podczas implementowania opakowania OOp dla SDL.

Intencją jest stworzenie klasy singleton, która inicjuje SDL po jej skonstruowaniu i wyłącza SDL, gdy zostanie zniszczona. Klasa singleton ma metodę statycznągetInstance to zwraca ashared_ptr do singletonu i konstruuje pojedynczą instancję, jeśli nie istnieje żadna instancja, pomysł polega na tym, że wszyscy klienci singletona są właścicielamishared_ptr do tego, a kiedy wszyscy klienci zostaną zniszczeni, singleton jest również niszczony. Rozumiem, że singletony (i inne globale) są ogólnie złe, ale myślę, że może to być jeden z niewielu przypadków, w których singleton jest odpowiedni, ponieważ może być tylko jedna biblioteka SDL w użyciu.

Problem polega na zwrocieshared_ptr zgetInstance metoda. Zamiast używać tego samegoshared_ptr obiekt menedżerashared_ptr instancje są niepowiązane, a zniszczenie jednego z nich zwalnia singleton.

#include <iostream>
#include <memory>
using namespace std;

class Foo
{
public:
    ~Foo(){cout << "Foo <" << this << "> destroyed\n"; instance_ = nullptr;}
    static shared_ptr<Foo> getInstance()
    {
        if(instance_ == nullptr)
            instance_ = new Foo;
        //problem: the shared pointers created are unaware of each other
        return shared_ptr<Foo>(instance_);
    }
private:
    Foo(){cout << "Foo <" << this << "> constructed\n";}
    Foo(Foo& other){}
    void operator=(Foo& other){}
    static Foo* instance_;
};

Foo* Foo::instance_ = nullptr;

int main()
{
    shared_ptr<Foo> a = Foo::getInstance();
    shared_ptr<Foo> b = Foo::getInstance();
    shared_ptr<Foo> c = Foo::getInstance();
}

Wydajność:

Foo <0x3e2a10> constructed
Foo <0x3e2a10> destroyed
Foo <0x3e2a10> destroyed
Foo <0x3e2a10> destroyed

questionAnswers(2)

yourAnswerToTheQuestion