Differenza tra pattern Singleton e auto_ptr resp. unique_ptr

1

Sto mantenendo un codice legacy di una simulazione fisica. L'oggetto di calcolo è costruito come un singleton, per garantire che ci sia una sola istanza. Un collega mi ha detto che quel singleton è completamente obsoleto e dovrei istanziarlo attraverso uno smartpointer. Ma penso che non sia la stessa cosa, perché l'inizializzazione di uno smartpointer non mi garantisce che esiste solo una istanza di questo oggetto, giusto?

Se voglio avere una singola istanza di un oggetto nel mio codice, quale è preferibile:

Per utilizzare il modello singleton o inizializzare l'oggetto tramite uno di questi smartpointers ( auto_ptr<> o unique_ptr<> ).

    
posta Smii 28.11.2013 - 08:38
fonte

2 risposte

6

Se vuoi far sì che ci sia solo una singola istanza di qualche classe, allora devi usare il modello Singleton. (a parte la domanda se la tua analisi è corretta che ti servirà solo una singola istanza.)

I puntatori intelligenti C ++ auto_ptr<> e unique_ptr<> impongono un contratto completamente diverso, ovvero che esiste un solo riferimento (o puntatore) a una determinata istanza.

Ad esempio, questo codice è perfettamente legale, ma ci sono chiaramente due casi di Resource :

class Resource {
// ...
};

std::unique_ptr<Resource> instance1(new Resource());
std::unique_ptr<Resource> instance2(new Resource());
    
risposta data 28.11.2013 - 08:55
fonte
1

In C ++ 11 il "modello singleton" non è altro che una variabile statica all'interno di un corpo di una fica:

Se vuoi impedire che un oggetto venga istanziato basta fare

class Object
{
private:
   Object() = default;
   Object(const Object&) = delete;
public:
   static Object& instance() { static Object z; return z; }
};
    
risposta data 28.11.2013 - 09:01
fonte

Leggi altre domande sui tag