2013-02-11 30 views
0

我有一個C++稱爲MemMgr單工廠狀類,這是負責在庫管理堆存儲器的對象的:實現工廠,其登記非靜態成員函數將其在C++

#include <vector> 
class MemMgr 
{ 
    public: 

     // Callback interface of functions to register with MemMgr 
     typedef size_t (*MemSizeFunc)(void); 

     void Register(MemSizeFunc memSizeFunc); 

     static MemMgr & GetInst(void); 

     // more public functionality related to managing memory 

    private: 

     // a vector (not a map) of functions pointers to keep track of 
     std::vector<MemSizeFunc> m_memSizeFuncs; 

     MemMgr(void); 
     MemMgr(MemMgr const &); 
     MemMgr & operator= (MemMgr const &); 

     // more private functionality related to managing memory 
}; 

什麼我希望能夠做的是讓想要利用託管內存的任何類的對象能夠通過(非靜態)成員函數向MemMgr註冊自己,該函數將計算並返回受管理的數量該特定對象需要的內存。像下面這樣:

class MemMgrUser 
{ 
    public: 

     MemMgrUser(void) 
     { 
      MemMgr::GetInst().Register(GetManagedMemSize); 
     } 

    private: 

     size_t GetManagedMemSize(void) 
     { 
      // calculations involving member variables 
     } 
}; 

(。然後,之前MemMgr實際分配任何內存,它會以找出內存分配量查詢註冊到它的大小相關的功能)

但是,當我嘗試上述方法b/c我試圖註冊成員函數指針,而不是普通香草函數指針,編譯器大叫我。

有沒有人對我如何實現這樣的功能有任何建議?看到模板實現(或多態一)如何實現,我有問題。

謝謝

亞倫

+0

使用'的std ::功能'(或'的boost :: function',如果你沒有訪問C++ 11庫)。 – Mankarse 2013-02-11 20:24:22

+0

如果我明白,你嘗試通過使用它的一個成員函數來獲取對象的大小,但在創建對象本身之前?這聽起來不太可能(也許我錯了)。 – Synxis 2013-02-11 20:37:06

+0

Mankarse,謝謝!那的確的確行得通! – Aaron 2013-02-11 21:49:07

回答

0

你甚至不嘗試註冊一個成員函數指針。那將必須被指定爲&MemMgrUser::GetManagedMemSize。除了在調用它的表達式中,不能使用成員函數的普通名稱。

但即使您有一個成員函數指針,也不能以與具有相同明顯簽名的普通函數指針相同的方式使用。調用成員函數總是需要一個對象來調用它。該函數中可用的指針this是一個附加的隱藏參數。

如果您可以使用C++ 11標準庫的功能,則可以使用typedef std::function<size_t (void)> MemSizeFunc;而不是當前的typedef。這允許您存儲各種可用該簽名調用的函數和函數對象,如MemSizeFunc。特別是,你可以註冊綁定到一個合適的對象MemMgrUserGetManagedMemSize成員函數,例如:

MemMgrUser() 
{ 
    MemMgr::GetInst().Register(std::bind(&MemMgrUser::GetManagedMemSize, *this)); 
} 
+0

像魅力一樣工作!謝謝! – Aaron 2013-02-11 21:48:34

相關問題