我有两个类:一个对象类和一个对象管理器类。 ObjectManager 类通过 ptr_vector 容器存储“对象”。在某些情况下,我需要检索对这些存储指针的引用以对它们执行单独的操作。我将如何着手这样做?
可编译的伪代码:
#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/shared_ptr.hpp>
class Object
{
public:
int m_Id;
Object(int id) : m_Id(id) { }
};
class ObjectManager
{
private:
typedef boost::shared_ptr<Object> ObjectPtr;
typedef boost::ptr_vector<Object> ObjectVectorPtr;
typedef ObjectVectorPtr::iterator ObjectIt;
ObjectVectorPtr vector_;
void AddObject(Object *obj) {
vector_.push_back(obj);
}
ObjectPtr FindObject(int id) {
for (ObjectIt it = vector_.begin(); it != vector_.end(); it++) {
if (it->m_Id == id) {
// Found the object...How to return a shared_ptr reference to it?
// The line below is invalid, obviously:
// cannot convert parameter 1 from 'Object' to 'const boost::shared_ptr<T> &'
return *it;
}
}
// We could not find anything.
return ObjectPtr();
}
};
基本上我希望 ObjectManager 保留所有权,但我也希望其他类能够获得对该对象的引用,根据正在发生的事情对该对象使用调用方法,然后继续。
最佳答案
将您的容器转换为使用 shared_ptr
作为成员(member):
#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/shared_ptr.hpp>
#include <vector>
class Object
{
public:
int m_Id;
Object(int id) : m_Id(id) { }
};
class ObjectManager
{
private:
typedef boost::shared_ptr<Object> ObjectPtr;
typedef std::vector<ObjectPtr> ObjectVectorPtr;
typedef ObjectVectorPtr::iterator ObjectIt;
ObjectVectorPtr vector_;
void AddObject(ObjectPtr& obj) {
vector_.push_back(obj);
}
ObjectPtr FindObject(int id) {
for (ObjectIt it = vector_.begin(); it != vector_.end(); ++it) {
if (it->get()->m_Id == id) {
// Found the object - return a shared_ptr reference to it
return ObjectPtr(*it);
}
}
// We could not find anything.
return ObjectPtr();
}
};
顺便说一句 - 更喜欢 ++it
对比it++
为了避免额外的构造,如果容器变大,不要使用这样的匹配 - 切换到 std::map<int, ObjectPtr>
与 m_id
作为 key ,或 std::set具有适当定义的 less
功能。
如果我是 super 迂腐的人,我会建议用调用 std::find_if 来替换您的查找循环, 带有匹配 Object::m_id
的谓词...
关于c++ - 如何从 boost ptr_vector 中检索引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3765019/