2013-05-03 130 views
3

我在這裏尋找幫助。指向類函數的指針

我的課

LevelEditor 

具有的功能是這樣的:

bool SetSingleMast(Game*, GameArea*, GameArea*, vector<IShip*>*); 
bool SetDoubleMast(Game*, GameArea*, GameArea*, vector<IShip*>*); 
... 

在main.cpp中,我想使指針關卡編輯器對象的函數的數組。我在做這樣的事情:

bool (*CreateShips[2])(Game*, GameArea*, GameArea*, vector<IShip*>*) = 
{LevelEdit->SetSingleMast, LevelEdit->SetDoubleMast, ...}; 

但它給我一個錯誤:

error C2440: 'initializing' : cannot convert from 'overloaded-function' to 
'bool (__cdecl *)(Game *,GameArea *,GameArea *,std::vector<_Ty> *)' 
with 
[ 
    _Ty=IShip * 
] 
None of the functions with this name in scope match the target type 

我甚至不知道這是什麼意思。有人能幫助我嗎?

+5

指向函數的指針與指向_member_函數的指針不同。我建議你閱讀['std :: function'](http://en.cppreference.com/w/cpp/utility/functional/function)和['std :: bind'](http:// en。 cppreference.com/w/cpp/utility/functional/bind) – 2013-05-03 11:56:17

+0

你不能有指向特定對象函數的指針,而是指向類的函數(方法) - 「LevelEditor :: SetSingleMast」。 – 2013-05-03 11:56:25

+2

並使用typedef! – jrok 2013-05-03 11:56:46

回答

6

您不能使用普通函數指針指向非靜態成員函數;您需要的是指向成員的指針。

bool (LevelEditor::*CreateShips[2])(Game*, GameArea*, GameArea*, vector<IShip*>*) = 
{&LevelEditor::SetSingleMast, &LevelEditor::SetDoubleMast}; 

,你需要一個對象或指針調用他們:

(level_editor->*CreateShips[1])(game, area, area, ships); 

雖然,假設你可以使用C++ 11(或升壓),你可能會發現它更易於使用std::function來包裝任何類型的可調用類型:

using namespace std::placeholders; 
std::function<bool(Game*, GameArea*, GameArea*, vector<IShip*>*)> CreateShips[2] = { 
    std::bind(&LevelEditor::SetSingleMast, level_editor, _1, _2, _3, _4), 
    std::bind(&LevelEditor::SetDoubleMast, level_editor, _1, _2, _3, _4) 
}; 

CreateShips[1](game, area, area, ships); 
+0

非常感謝,我會嘗試這個並使用typedef。 – hugerth 2013-05-03 12:05:05