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