So che questa è una domanda molto sciocca sul modello di singleton, ma comunque è la prima scelta dell'intervistatore. Potrebbe farmi sapere in basso snippet di codice.query relativa al comportamento singleton
(1) Dopo aver eliminato l'oggetto singleton perché ancora sono in grado di chiamare il metodo show() e funziona correttamente.
delete obj;
obj=NULL;
obj->show();
(2) Dopo aver creato oggetto obj1 perché io non sono in grado di stampare il contenuto di acquire_lock e della funzione RELEASE_LOCK anche statment stampa "One Time" verrà stampato una volta e se incrementiamo contatore i allora invece di 2 essa sta stampando solo 1, perché?
Foo *obj1=MySingleton<Foo>::GetInstance();
(3) l'utilizzo di unique_ptr con oggetto singleton avrà implicazioni negative.
frammento di codice:
#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;
}
Nota: Il Blocco funzioni correlate sono solo fittizio implementazione.
Grazie per il chiarimento. Per il punto (1) se non settoro ancora il NULL funziona e per il punto (2) se cancelliamo l'oggetto singleton allora ho bisogno di impostare m_pOnlyOneInstance = NULL implementando il metodo di pulizia statico per lo scopo di cancellazione dell'oggetto singleton. – user3522354
(1) Giusto, quella funzione membro non fa mai riferimento a 'this', quindi naturalmente non importa quale valore usi. (2) Sì, altrimenti la funzione 'GetInstance' non ha idea se sia necessario istanziare nuovamente la classe più tardi. Ma una funzione di pulizia statica può essere utilizzata solo quando si è certi che nessun'altra variabile faccia riferimento al singleton, quindi non la consiglierei. – mooiamaduck
Intendete dire che non è necessario fornire una funzione di pulizia statica per eliminare esplicitamente l'oggetto Singleton durante l'uscita dell'applicazione. – user3522354