Несколько способов добавить элемент в контейнер с интеллектуальными указателями. Мне интересно, по какому пути вы пойдете.Добавить элемент в контейнер с интеллектуальными указателями
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>
};
Я лично пойти на пути 1. Любое больше преимуществ для пути 2 и 3 или недостатки Способ 1, что я должен идти на 2 или 3?
sftrabbit дает много хороших точек. В следующем общем случае. Как использовать Путь 2 или 3, чтобы сделать это легко? Пользователь использует диалог для создания нового производного элемента. Наносится на std::unique_ptr<DerivedItem> item
. При нажатии кнопки «ОК» он добавляется в контейнер. Если не удалось добавить, вернитесь в диалоговое окно для редактирования.
+1, особенно причина 2. – us2012
Рассмотрим случай. Пользователь использует диалог для создания нового производного элемента. Он помещается на 'std :: unique_ptr item'. При нажатии кнопки «ОК» он добавляется в контейнер. Если не удалось добавить, вернитесь в диалоговое окно для редактирования. Какой способ удобнее? Благодарю. –
user1899020
@ user1899020 Я придерживаюсь своего ответа. Это не зависит от того, для чего именно вы используете «MyContainer». Я просто рекомендую разрешить распространение исключения, если вы не можете добавить «Элемент». Это зависит от клиента. –