1

我有一个类Bar,它存储派生自BarItem

#include <list>
#include <memory>

class Bar {
public:
    typedef std::shared_ptr<BarItem> item_ptr;

    void add_item(item_ptr item) {
        items_.push_back(item);
    }

private:
    std::list<item_ptr> items_;
};

我有另一个类Note,它是BarItem. Note目前要添加我正在做的对象的副本:

Bar my_bar;
Note my_note;

my_bar.add_item(Bar::item_ptr(new Note(my_note)));

这有点难看;我想知道是否有更好的方法或自动化方法?

4

3 回答 3

1

您实际上无法避免复制(在 C++11 中您可以将其变为移动),但您可以“自动化”它,以便通过重载add_item每种类型的函数(可能是 的子级BarItem)来节省一些击键。

template <class T>
typedef enable_if<is_base_of<BarItem, T>::value,void>::type add_item(const T& item) { /* or T&& */
    items_.push_back(item_ptr(new T(item)));
}
于 2012-06-14T14:43:31.597 回答
1

您可以将函数本身中丑陋的部分移动为:

template<typename ItemType>
void add_item(ItemType item) //change the signature
{ 
    items_.push_back(new ItemType(item));  //add the copy!
}

并将其称为:

my_bar.add_item(my_note);
于 2012-06-14T14:38:57.310 回答
0

在容器中使用指针是减少对象复制的一种方法。但是您处理 Note 对象创建的方式涉及通过复制构造函数对其进行复制!

你能避免拥有一个对象,而是拥有一个指向该对象的指针吗?您可以通过将创建放在一个函数(工厂)中来做到这一点。该函数将接受构造函数的参数,新建对象并返回一个智能指针。

于 2012-06-14T14:43:29.477 回答