在智能指针容器中添加项目的几种方法。我想知道你会走哪条路。
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
。当单击“确定”按钮时,它被添加到容器中。如果添加失败,请返回对话框进行编辑。