Kilka sposobów dodawania elementu do pojemnika z inteligentnymi wskaźnikami. Zastanawiam się, w którą stronę pójdziesz.Dodaj element do pojemnika z inteligentnymi wskaźnikami
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>
};
osobiście pójść na Drogę 1. Wszelkie więcej korzyści na drodze 2 i 3 lub wad sposób 1, które powinny iść na 2 lub 3?
sftrabbit daje wiele dobrych punktów. W poniższym typowym przypadku. Jak korzystać z Way 2 lub 3, aby zrobić to z łatwością? Użytkownik używa okna dialogowego do wygenerowania nowego elementu pochodnego. Jest umieszczony na std::unique_ptr<DerivedItem> item
. Po kliknięciu przycisku "OK" jest on dodawany do kontenera. Jeśli nie udało się dodać, wróć do okna dialogowego edycji.
+1, zwłaszcza dla rozumu 2. – us2012
Rozważmy przypadek. Użytkownik używa okna dialogowego do wygenerowania nowego elementu pochodnego. Jest umieszczony na 'std :: unique_ptr item'. Po kliknięciu przycisku "OK" jest on dodawany do kontenera. Jeśli nie udało się dodać, wróć do okna dialogowego edycji. Który sposób jest wygodniejszy? Dzięki. –
user1899020
@ user1899020 Trzymam się mojej odpowiedzi. Jest niezależny od tego, do czego dokładnie używasz "MyContainer". Po prostu zalecamy zezwolenie na propagowanie wyjątku, jeśli nie możesz dodać elementu "Przedmiot". Od tego zależy klient. –