我开始使用c 11功能,我喜欢使用智能指针来拥有对象.这是我的课:
class MyClass { public: vector<MyObject*> get_objs() const; private: vector<unique_ptr<MyObject>> m_objs; };
语义是MyClass拥有通过make_unique()创建的一系列MyObject. get_objs()返回一个原始指针的向量,以便各种调用者更新对象.因为这些调用者没有拥有对象,所以函数不返回向量< unique_ptr> ;. 但这意味着我需要实现get_objs():
vector<MyObjects*> MyClass::get_objs() const { vector<MyObjects*> ret; for (auto obj : my_objs) { ret.push_back(obj->get()); } return ret; }
我的关注是get_objs()被相当频繁地调用,每次有一个开销来构造这个原始指针向量.
有什么我可以在这里做的吗?如果没有c 11技巧来节省开销,我应该使用类型向量< MyObject *>对于m_objs在第一位?
UPDATE 1
Jonathan Wakely的解决方案使用operator []改进了我的,以便调用者可以直接访问各个对象.
还有其他解决方案吗?我不介意去调用get_objs()的所有地方,但是想看看是否有更好的解决方案.
另一个注意事项 – 我不能使用BOOST,只是一些限制我必须住.
解决方法
class MyClass { public: std::vector<std::unique_ptr<MyObject>> const& get_objs() const { return m_objs; } private: std::vector<std::unique_ptr<MyObject>> m_objs; };
一个const std :: unique_ptr< MyObject>&不能窃取所有权,并且与std :: unique_ptr< const MyObject>不一样.一个const std :: vector< std :: unique_ptr< MyObject>&只能对其数据进行常量访问.