2016-05-14 7 views
0

Ich versuche, eine GUI-Bibliothek zu machen. Und ich wünsche die folgende Aussage gültig. Außerdem ist der Benutzer nicht für die Freigabe von Speicher verantwortlich.Wie sicher zu verwenden und löschen für diese Situation

// Create a GUI context 
xGUI::xGUI gui(800, 600); 
// gui.objects is a std::map<std::string, IWidget *> 
gui.objects["btn"] = new xGUI::Button("Close", 50, 50); 
gui.objects["btn2"] = gui.objects["btn"]->clone(); 
// Block end gui will free all the objects. 

Wie Sie sehen können, Klon ist hässlich, aber notwendig. (Gibt es eine Lösung?) Aber dieser Klon wird verwenden, um neue Speicher in der Bibliothek zuzuweisen. dann sei frei von dtor von xGUI was ich in Header-Datei geschrieben habe. neu in der Bibliothek und im Hauptprogramm löschen ... Wird es ein Problem sein ??

+2

Verwenden unique_ptr und Shared_ptr –

+0

„hässlich, aber benötigt“ Warum? Wozu? 'gui.objects [" btn2 "] = gui.objects [" btn2 "] -> clone();' Dieser Aufruf sieht seltsam aus. Warum würden Sie ein Objekt durch seinen Klon ersetzen? –

+0

Sorry für diesen Tippfehler. gui.objects ["btn2"] = gui.objects ["btn"] -> clone() –

Antwort

3

Stattdessen mit einem std::map<std::string, IWidget*> denken über die Verwendung eines std::map<std::string, std::unique_ptr<IWidget>>.

Ein std::unique_ptr<T> ist ein spezieller Wrapper um ein Objekt, das automatisch die Zerstörung des Objekts verwaltet, wenn die unique_ptr selbst zerstört wird. Dies macht das Verwalten von Speicher auf Objekten, die einen einzelnen Besitzer haben (wie es in Ihrem Fall scheint), ziemlich trivial.

+0

Ich habe diese Lösung schnell gefunden, nachdem ich die Frage tatsächlich gepostet habe. aber das zwingt uns, das Objekt mit gui.objects zu benutzen. Ich kann die Zeiger nicht vorübergehend auf einer anderen Variablen speichern und sie verwenden. gui.objects ["btn"]. get() kann damit umgehen aber hässlich nochmal –

0

Verwenden Zeiger nicht, aber Wrapper, die ähnlich verhalten zählen intelligente Zeiger und setzen die gewünschte Schnittstelle verweisen:

// Create a GUI context 
xGUI::xGUI gui(800, 600); 
// gui.objects is a std::map<std::string, IWidget *> 
gui.objects["btn"] = xGUI::Button("Close", 50, 50); 
gui.objects["btn2"] = gui.objects["btn"].clone(); 

Schauen Sie MA, keine Zeiger, keine Speicherlecks.

Werfen Sie einen Blick auf dieser json Bibliothek, mit polymorphem Verhalten, jedoch ohne die Notwendigkeit für den Benutzer mit dynamischer Speicherzuweisung zu bewältigen: https://github.com/TorstenRobitzki/Sioux/blob/master/source/json/json.h

+0

Könnten Sie das genauer erklären? Was ist die Deklaration von gui.objects –

+0

'std :: map ' mit 'class Button: public Widget'. Widget enthält dann einen Zeiger auf eine polymorphe Implementierung, die durch Ableiten von Klassen über einen geschützten c'tor gesetzt wird. –

+0

Ich habe es. Ich bezweifle zunächst, dass wir Knopf in Widget-Objekt speichern können. Vielen Dank. aber Klon ist immer noch da –