2

我有两个类:一个 Object 类和一个 ObjectManager 类。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 保留所有权,但我也希望其他类能够获得对该对象的引用,根据正在发生的事情对该对象使用调用方法,然后继续。

4

2 回答 2

2

将您的容器转换shared_ptr为成员:

#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();
  }
};

顺便说一句 - 更喜欢++itvsit++以避免额外的构造,如果容器变大,不要使用这样的匹配 - 切换到std::map<int, ObjectPtr>withm_id作为键,或者std::set使用适当定义的less函数。

如果我是超级迂腐的,我建议用调用std::find_if替换你的 find 循环,并使用匹配的谓词Object::m_id...

于 2010-09-21T22:47:20.750 回答
0

您不能返回 shared_ptr 因为该对象最初不是作为共享对象创建的 - 引用计数甚至会是多少?

但是,您可以很容易地返回 Object*:

Object* 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;
      }
    }
于 2010-09-21T22:47:09.830 回答