2

Object クラスと ObjectManager クラスの 2 つのクラスがあります。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();
  }
};

++itところで-余分な構築を避けるためにvsを好みit++、コンテナが大きくなった場合はこのようなマッチングを使用しないでください-キーとしてに切り替えるかstd::map<int, ObjectPtr>、適切に定義された関数でstd::setに切り替えます。m_idless

私が非常にペダンティックだった場合、検索ループをstd::find_ifへの呼び出しに置き換え、次の条件に一致する述語を使用することをお勧めし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 に答える