Mehrere Möglichkeiten zum Hinzufügen eines Elements in einem Container mit Smartpointern. Ich frage mich, auf welche Art Sie gehen werden.Hinzufügen eines Elements in einem Container mit Smartpointern
class MyContainer
{
private:
std::vector<std::unique_ptr<Item>> mItems;
public:
bool Add(Item* item);
// This is Way 1
//
// Advantages:
// - Easy to add derived items, such as Add(new DerivedItem);
// - No interface change if smart pointer type changes to such as shared_ptr;
//
// Disadvantages:
// - Don't explicitly show the item to add must be allocated on heap;
// - If failed to add, user has to delete the item.
bool Add(std::unique_ptr<Item> item);
// This is Way 2
// Disadvantages and advantages are reversed from Way 1.
// Such as to add derived item, Add(std::unique_ptr<Item>(new DerivedItem));
// |
// easy to write DerivedItem here for an error
bool Add(std::unique_ptr<Item>& item);
// This is Way 3
// Similar to Way 2, but when failed to add, item still exist if it is a
// reference of outer unique_ptr<Item>
};
ich persönlich für Weg gehen 1. Jede weitere Vorteile für Way 2 und 3 oder Nachteile Way 1, die ich für 2 oder 3 gehen sollte?
sfstrabbit gibt viele gute Punkte. Im folgenden häufigen Fall. Wie benutze ich Way 2 oder 3 um es einfach zu machen? Benutzer verwendet einen Dialog, um ein neues abgeleitetes Element zu generieren. Es ist auf std::unique_ptr<DerivedItem> item
gesetzt. Wenn Sie auf 'OK' klicken, wird es dem Container hinzugefügt. Wenn das Hinzufügen fehlgeschlagen ist, kehren Sie zum Dialogfeld für eine Bearbeitung zurück.
+1, vor allem für die Vernunft 2. – us2012
Betrachten wir einen Fall. Benutzer verwendet einen Dialog, um ein neues abgeleitetes Element zu generieren. Es wird auf 'std :: unique_ptr item' gesetzt. Wenn Sie auf 'OK' klicken, wird es dem Container hinzugefügt. Wenn das Hinzufügen fehlgeschlagen ist, kehren Sie zum Dialogfeld für eine Bearbeitung zurück. Welcher Weg ist bequemer? Vielen Dank. –
user1899020
@ user1899020 Ich bleibe bei meiner Antwort. Es ist unabhängig davon, wofür Sie 'MyContainer' genau verwenden. Ich empfehle nur, dass Sie eine Ausnahme propagieren lassen, wenn Sie das 'Item' nicht hinzufügen können. Es liegt an dem Kunden, damit umzugehen. –