2016-06-05 12 views
4

Ich habe gesehen, dass Konstruktoren, Kopierkonstruktor, Destruktor und Zuweisungsoperator in privaten Bereich in einer typischen Singletone-Klasse gehalten werden. z.B.Warum privater Destruktor in einer Singleton-Klasse?

class CMySingleton 
{ 
public: 
    static CMySingleton& Instance() 
    { 
    static CMySingleton singleton; 
    return singleton; 
    } 

private: 
    CMySingleton() {}         // Private constructor 
    ~CMySingleton() {} 
    CMySingleton(const CMySingleton&);     // Prevent copy-construction 
    CMySingleton& operator=(const CMySingleton&);  // Prevent assignment 
}; 

Nun meine Frage ist

warum shoule wir halten destructor Zuweisungs-Operator in Privat Umfang? Ist es obligatorisch?

Bricht ein öffentlicher Destruktor eine Eigenschaft einer Singleton-Klasse? Da unsere Objektkonstruktion eingeschränkt ist, gibt es keine Chance auf eine unerwünschte Zerstörung .

Ich kann verstehen, dass private Zuweisung Operator eine Selbst Zuordnung verhindern kann, aber verletzt eine öffentliche Zuweisung Operator ohnehin andere als zusätzliche Laufzeit?

+1

Falsche Frage. Die richtige Frage ist: Warum existiert dieser verdammte und dumme Singleton überhaupt? – SergeyA

+0

@SergeyA: Weil es im GoF-Buch ist :) –

Antwort

8

Durch die Deaktivierung des Destruktors wird potenziell verhindert, dass jemand versucht, delete über einen Zeiger auf den Singleton aufzurufen.

auto& singleton = CMySingleton::Instance(); 
auto pointer_to_singleton = &singleton; 
delete pointer_to_singleton; // Bad! 

Durch Deaktivieren des Zuweisungsoperators wird eine harmlose aber unsinnige Selbstzuweisung verhindert. Siehe this answer. Wenn jemand dies tut, besteht die Gefahr, dass es ein Fehler war, also könntest du es genauso gut verhindern.

+1

Ich habe keinen Zweifel an der privaten ctor und copy-ctor. Mit einem Zuweisungsoperator kann kein neues Objekt erstellt werden. Vereitelt der öffentliche Bereich den Punkt, abgesehen von der Einschränkung einer Selbstzuweisung während der Kompilierung? –

+0

@ paper.plane Sie haben Recht. Ich habe die Antwort geändert, um nur Zuweisungen und Destruktoren zu berücksichtigen. –

+0

Danke @Chris –

-1

Ein privater Destruktor macht hier nichts Sinnvolles.

Für den Kopierkonstruktor und einen Zuweisungsoperator haben Sie bereits Ihre eigene Frage beantwortet, indem Sie die Kommentare neben ihnen in dem gezeigten Code sorgfältig reproduziert haben. Lies einfach die Kommentare. Die einzige Sache, die dort hinzugefügt wird, ist, dass dieser Code C++ 11 vorausgehen muss, weil Sie diese Tage nur löschen.

+1

Ich habe keinen Zweifel an der privaten Ctor und copy-ctor. Mit einem öffentlichen Zuweisungsoperator kann kein neues Objekt erstellt werden. Unterbindet es das Singleton-Konzept, abgesehen von der Einschränkung einer Selbstzuweisung während der Kompilierung? –