private Destruktor für die singleton-Klasse
Ist es obligatorisch, um eine private Destruktor für eine singleton-Klasse.
- Nein, es ist nicht. Warum fragst du? Wer würde Sie dazu zwingen? Und Fragen, die eine ja/Nein-Antwort ist nicht eine gute Idee.
- Zumindest solche Fragen kann nicht geschlossen werden, um als argumentative.
:)
- ist eine Last von alten Müll, hab ich Recht?" 😉
- wer mit C++ mehr?"
- Richtige Antworten sollten mit ja/Nein. Kein Platz für Argumente. Bin ich im Recht?
:)
- Wenn das singelton-Objekt gibt einen Verweis von getInstance(). Dann warum würden Sie sogar versuchen, es zu löschen? Somit Annullierung des Problems: stackoverflow.com/questions/1008019/c-singleton-design-pattern/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist möglicherweise nicht das was du suchst.. Aber als Referenz, verwende ich es wie folgt:
Dann am Ende von meinem Programm, ich nenne zerstören Sie das Objekt. Als Péter Punkte aus das system wieder den Speicher, wenn das Programm beendet wird, so gibt es keinen wirklichen Grund. Der Grund, warum ich ein vernichten ist, wenn Oger beschwert, dass ich noch nicht veröffentlicht, die Erinnerung, die ich zugeordnet. Danach habe ich es einfach verwenden, als "gute Art", da ich gerne Aufräumen nach mir selbst.
destroy
Sie bieten auch eine undichte Abstraktion. Sie sollten nachschlagen von Alexandrescu "Modern C++ Design" und nehmen Sie inspiration inLoki::Singleton
.Wenn das singleton implementiert ist als eine variable im globalen Bereich, es muss eine öffentlichen Destruktor. Nur öffentliche Mitglieder zugänglich sind, im globalen Gültigkeitsbereich.
Wenn es deklariert als static-member oder statische lokale Variable innerhalb der eigenen Klasse, dann der Destruktor privat. Der Destruktor aufgerufen wird, von innerhalb der Klasse scope, wo es zugänglich ist, wenn das Programm beendet wird. Das ist ein Weg, um durchzusetzen das Objekt ein singleton. Brauchen Sie, um stark zu erzwingen? Wenn dem so ist, ja. Es hängt davon ab, was meinen Sie mit "Pflicht."
static
ist eine der bequemste Weg. Was ist die Wirkung von aufrufengetGlobalA
nacha2
zerstört wurde (während der Zerstörung von globals) ? Ich fürchte, es würde dazu führen, UB.Alle Klassen einen Destruktor. Wenn Sie nicht erstellen der compiler wird es für Sie tun. Also deine Frage kann umformuliert werden zu: Ist der Destruktor für eine singleton-Klasse müssen private?
Die einfache Antwort ist Nein, es muss nicht sein.
Eine weitere interessante Frage: Ist es eine gute Idee, um den Destruktor der singleton-Klasse private?
Ja, im Allgemeinen, es ist eine gute Idee. Wenn Sie machen es die privaten dann Ihr client-code wird nicht aufgerufen der Destruktor durch Zufall. Ruft den Destruktor dazu, dass das singleton nicht für alle Kunden als Instanz wäre ungültig.
GetSingleton()->~CSingleton()
p = GetSingleton()
, und/* Momma told me to always delete my pointers:*/ delete p;
Object::Do(foo)
alsObject::GetInstance().do(foo)
... aber dann ist es nicht so, dass wir mit Dependency Injection da unten.Meiner Meinung nach, der Destruktor eine signleton sollte privat sein. Ansonsten somewone ist in der Lage, um 'löschen' für die singleton-Instanz. Ich weiß, normalerweise niemand wird es tun. Aber wenn wir darüber sprechen, Exzellenz design, es muss resistent gegen alle möglichen beabsichtigten oder unitnended Schäden.
Mit dem modernen C++ ist es erlaubt, zu erklären, auch privaten Destruktoren für statisch aufgebauten Objekte.
Hier ist mein code-snippet für Singleton:
Nicht, und in der Regel-Objekte in C++ sind nicht gegeben, privaten Destruktoren. Beachten Sie, dass Singleton bedeutet, dass es nur eine Instanz, und so ist es Aufbau, nicht Zerstörung, das muss kontrolliert /verhindert. In der Regel ein singleton einen privaten Konstruktor public destructor, eine private statische Instanz-variable, und ein public static singleton-get /"lazy construction" - Funktion, obwohl es Variationen über das Muster.
Können Sie wieder Referenz auf die singleton-Instanz.
static_cast
unnötig ist (Sie können implizit konvertieren von derived zu base), es ist nicht allzu schlimm. Gibt es Probleme mit dem Zugriff nach der Zerstörung, die Sie sollten versuchen zu verstehen, obwohl.