c++ - 如何从 boost ptr_vector 中检索引用?

标签 c++ boost ptr-vector

我有两个类:一个对象类和一个对象管理器类。 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/

相关文章:

c++ - 位图边界矩形算法 C++

c++ - 我可以使用 &= 阻止函数执行吗?

c++ - 为 boost::ptr_vector 创建一个容器类

c++ - Boost 仅序列化 std::wstring 的第一个字符

c++ - 对可执行项目进行单元测试

c++ - 有没有办法 Boost.Assign 一个 ptr_vector?

c++ - 我应该自己删除 boost::ptr_vector 的指针吗?

c++ - 使用互斥量时尝试引用已删除的函数

c++ - C++字符串表达式求解器运行冲突

c++ - 运算符 == 和 boost::detail::atomic_count 中的显式构造函数?