Wiem, że to bardzo głupie pytanie o wzór singletonowy, ale wciąż jest to pierwszy wybór ankietera. Czy możesz dać mi znać w poniższym fragmencie kodu?Pytanie dotyczące pojedynczego zachowania związane z zapytaniem
(1) Po usunięciu obiektu singleton wciąż mogę wywołać metodę show() i działa poprawnie.
delete obj;
obj=NULL;
obj->show();
(2) Po utworzeniu obj1 obiekt dlaczego nie jestem w stanie wydrukować zawartość acquire_lock i funkcji release_lock nawet statment print „One Time” zostanie wydrukowany raz i jeśli zwiększamy licznik I wtedy zamiast 2 go drukuje tylko 1, dlaczego?
Foo *obj1=MySingleton<Foo>::GetInstance();
(3) użycie unique_ptr z pojedynczym obiektem będzie miało negatywne implikacje.
fragment kodu:
#include <iostream>
#include <fstream>
#include <memory>
#include <string>
using namespace std;
static int i;
class Lock
{
public:
Lock(){};
~Lock(){};
void acquire_lock()
{
cout<<"aquired lock for class";
}
void release_lock()
{
cout<<"released lock for class";
}
};
class Foo
{
public:
void show()
{
cout<<"\ndone\n";
}
};
template <class T>
class MySingleton
{
protected:
MySingleton() {}
private:
//holds one and only object of MySingleton
static T* m_pOnlyOneInstance;
MySingleton(const MySingleton <T> &) {};
MySingleton <T> & operator=(const MySingleton <T> &) {};
~MySingleton() {};
public:
static T * GetInstance();
void foo()
{
cout<<"Mohan";
}
};
template <class T>
T* MySingleton<T>::GetInstance()
{
Lock lock;
if (m_pOnlyOneInstance == NULL)
{
lock.acquire_lock();
cout<<"one Time"<<endl;
i++;
if(m_pOnlyOneInstance == NULL)
{
m_pOnlyOneInstance = new T();
}
lock.release_lock();
}
return m_pOnlyOneInstance;
}
template <class T> T* MySingleton<T> :: m_pOnlyOneInstance=NULL;
int main()
{
//std::unique_ptr <Foo> obj (MySingleton<Foo>::GetInstance());
Foo *obj=MySingleton<Foo>::GetInstance();
//obj->show();
delete obj;
obj=NULL;
obj->show();
cout<<"\ncalling again\n";
Foo *obj1=MySingleton<Foo>::GetInstance();
obj1->show();
cout<<"i="<<i;
return 1;
}
Uwaga: Funkcja blokady związane są jedynie atrapę realizację.
Dzięki za wyjaśnienia. Dla punktu (1), jeśli nie ustawię wartości NULL nadal działa i dla punktu (2), jeśli usuniemy obiekt singleton, to muszę ustawić m_pOnlyOneInstance = NULL, wykonując metodę statycznego czyszczenia dla celu usuwania pojedynczych obiektów. – user3522354
(1) W porządku, funkcja składowa nigdy nie odwołuje się do "tego", więc naturalnie nie ma znaczenia, jakiej wartości używasz. (2) Tak, w przeciwnym razie funkcja 'GetInstance' nie będzie miała pojęcia, czy musi ponownie utworzyć klasę później. Ale funkcja statycznego czyszczenia może być użyta tylko wtedy, gdy masz pewność, że żadne inne zmienne nie odwołują się do singletonu, więc nie poleciłbym tego. – mooiamaduck
Czy chcesz powiedzieć, że nie musimy wykonywać funkcji czyszczenia statycznego, aby wyraźnie usunąć obiekt singleton podczas zamykania aplikacji. – user3522354