2012-03-31 8 views
2

boost::shared_ptrコンストラクターにカスタム削除メソッドを提供することに関して質問があります。ブーストのためのカスタムディレクターshared_ptr

たとえば、GameObjectsを作成/破棄するGameObjectFactoryクラスがあります。それはMemoryManagerのインスタンスを持ち、Allocate()/Deallocate()のメモリを持つことができます。 CreateObject()MemoryManagerによって割り当てられたGameObjectを返し、boost::shared_ptrにカプセル化されています。

boost::shared_ptrが破壊すると、MemoryManager->Deallocate()メソッドが呼び出されます。しかし、私はそれを正しく得ることはできません。私はこれらのエラーを取得:

error C2276: '&' : illegal operation on bound member function expression 
error C2661: 'boost::shared_ptr<T>::shared_ptr' : no overloaded function takes 2 arguments 

私はブーストドキュメントと私はstackoverflowのから得たヒットを読んだことが、まだ私はそれが権利を取得することはできません。私はなぜ以下のdosntの仕事を理解していない。

ここに私のコードです。

#ifndef _I_GAMEOBJECT_MANAGER_H 
#define _I_GAMEOBJECT_MANAGER_H 

#include "../../Thirdparty/boost_1_49_0/boost/smart_ptr/shared_ptr.hpp" 

#include "EngineDefs.h" 
#include "IMemoryManager.h" 
#include "../Include/Core/GameObject/GameObject.h" 

namespace Engine 
{ 
    class IGameObjectFactory 
    { 
    public: 
     virtual ~IGameObjectFactory() { } 

     virtual int32_t Init() = 0; 
     virtual bool Destroy() = 0; 
     virtual bool Start() = 0; 
     virtual bool Stop() = 0; 
     virtual bool isRunning() = 0; 
     virtual void Tick() = 0; 

     template <class T> 
     inline boost::shared_ptr<T> CreateObject() 
     { 
      boost::shared_ptr<T> ptr((T*) mMemoryMgr->Allocate(sizeof(T)),&mMemoryMgr->Deallocate); 


      return ptr; 
     } 

     template <class T> 
     inline boost::shared_ptr<T> CreateObject(bool UseMemoryPool) 
     { 
      boost::shared_ptr<T> ptr((T*) mMemoryMgr->Allocate(sizeof(T),UseMemoryPool), &mMemoryMgr->Deallocate); 


      return ptr; 
     } 

    protected: 
     IMemoryManager* mMemoryMgr; 
    }; 

} 

#endif 

答えて

7

shared_ptrは、ポインタ型(T*)の1つの引数を受け入れる関数であると想定しています。メンバー関数に渡そうとしています。shared_ptrにはIMemoryManagerオブジェクトへの参照がないため、機能しません。この問題を回避するには、ポインタオブジェクトを受け取り、IMemoryManagerを呼び出す静的メンバ関数を作成する::割り当て解除():

template <class T> 
static void Deallocate(T* factoryObject) 
{ 
    factoryObject->mMemoryMgr->Deallocate(); 
} 

あなたは、このようなあなたのshared_ptrを作成することができます

boost::shared_ptr<T> ptr((T*) mMemoryMgr->Allocate(sizeof(T),UseMemoryPool), &IGameObjectFactory::Deallocate<T>); 
+0

を私はまだ取得次のエラーが発生しました:エラーC2661: 'boost :: shared_ptr :: shared_ptr':オーバーロードされた関数は2つの引数をとりません最新ブーストビルドを使用 – KaiserJohaan

+0

@KaiserJohaan:どのバージョンのBoostを使用していますか? –

+0

私はブーストを使用しています1.49.0 – KaiserJohaan

1

boost::shared_ptr、などstd::shared_ptrカスタム削除手段として述語を取ります。だから関数や関数を渡すことができます。あなたが渡しているのは、オブジェクトへのポインタがないので、それを呼び出すには不十分なメンバ関数へのポインタです。詳細はPointers to member functionsを勉強しなければなりません。あなたが望むものを実現する方法はたくさんありますが、オブジェクトファクトリポインタを覚えている自分のシンプルファンクタを作成して、shared_ptrによって呼び出された後に削除する適切なメソッドを呼び出します。また、実際にshared_ptrが必要でない限り、intrusive_ptrを使用することを検討してください。はるかに効率的です。

関連する問題