Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从boost ptr_向量检索引用?_C++_Boost_Ptr Vector - Fatal编程技术网

C++ 如何从boost ptr_向量检索引用?

C++ 如何从boost ptr_向量检索引用?,c++,boost,ptr-vector,C++,Boost,Ptr Vector,我有两个类:一个对象类和一个ObjectManager类。ObjectManager类通过ptr_向量容器存储“对象”。在某些情况下,我需要检索对这些存储指针的引用,以便对它们执行单独的操作。我该怎么做呢 可编译伪代码: #include <boost/ptr_container/ptr_vector.hpp> #include <boost/shared_ptr.hpp> class Object { public: int m_Id; Object(int

我有两个类:一个对象类和一个ObjectManager类。ObjectManager类通过ptr_向量容器存储“对象”。在某些情况下,我需要检索对这些存储指针的引用,以便对它们执行单独的操作。我该怎么做呢

可编译伪代码:

#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();
  }
};
#包括
#包括
类对象
{
公众:
国际货币基金组织;
对象(int-id):m_-id(id){}
};
类对象管理器
{
私人:
typedef boost::shared_ptr ObjectPtr;
typedef boost::ptr_向量ObjectVectorPtr;
typedef ObjectVectorPtr::迭代器ObjectIt;
ObjectVectorPtr向量;
void AddObject(Object*obj){
矢量推回(obj);
}
ObjectPtr FindObject(int-id){
for(ObjectIt it=vector_uu.begin();it!=vector_u.end();it++){
如果(it->m_Id==Id){
//找到该对象…如何返回对该对象的共享\u ptr引用?
//下面这行显然无效:
//无法将参数1从“Object”转换为“const boost::shared\u ptr&”
归还它;
}
}
//我们什么也找不到。
返回ObjectPtr();
}
};

基本上我希望ObjectManager保留所有权,但我也希望其他类能够获得对该对象的引用,根据发生的情况对该对象使用调用方法,然后继续。

您不能返回共享\u ptr,因为该对象最初不是作为共享对象创建的-引用计数是多少

但是,您可以非常轻松地返回对象*:

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;
      }
    }
Object*FindObject(int-id){
for(ObjectIt it=vector_uu.begin();it!=vector_u.end();it++){
如果(it->m_Id==Id){
//找到该对象…如何返回对该对象的共享\u ptr引用?
//下面这行显然无效:
//无法将参数1从“Object”转换为“const boost::shared\u ptr&”
返回&*它;
}
}

将您的容器转换为使用
共享\u 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();
  }
};
#包括
#包括
#包括
类对象
{
公众:
国际货币基金组织;
对象(int-id):m_-id(id){}
};
类对象管理器
{
私人:
typedef boost::shared_ptr ObjectPtr;
typedef std::vector ObjectVectorPtr;
typedef ObjectVectorPtr::迭代器ObjectIt;
ObjectVectorPtr向量;
void AddObject(ObjectPtr&obj){
矢量推回(obj);
}
ObjectPtr FindObject(int-id){
for(ObjectIt it=vector_u.begin();it!=vector_u.end();++it){
如果(it->get()->m_Id==Id){
//找到对象-返回对该对象的共享\u ptr引用
返回ObjectPtr(*it);
}
}
//我们什么也找不到。
返回ObjectPtr();
}
};
顺便说一句-更喜欢
++it
而不是
it++
以避免额外的构造,如果容器变大,不要使用这样的匹配-切换到
std::map
,使用
m_id
作为键,或者使用适当定义的
less
函数


如果我是个超级学究,我会建议用调用替换你的find循环,用一个匹配
Object::m_id

的谓词,谢谢Steve!另外,如果你不介意回答的话,当你说“如果容器变大,不要像这样使用匹配”时你指的是性能问题吗?@jbaez:是的,这是性能相关的-像这样的匹配将是O(n)-搜索映射(二叉树)是O(logn)