2013-12-15 42 views
0

我想實現的一個學校項目,在那裏我有一個包含函數指針在錯誤:無效使用無效的表達,C++

map<string, YMenu> 

形式當我嘗試調用一個STL地圖的菜單系統YMenu中的一個成員函數,通過地圖添加一個新的函數指針到一個向量,我得到一個錯誤,說它是「void expression的無效使用」。我已附上下面的相關代碼。

矢量保持陣列:

vector<void (*)() > nextAction; 

功能添加函數指針:

void YMenu::addNextAction(int index, void (*Action)()) 
    { 
     nextAction[index] = Action; 
    } 

語法調用將產生的錯誤成員函數時使用:

Menus["0.0"].addNextAction(1, Menus["0.1"].show()); 

用於可能的任何想法解決方案?我試圖找到谷歌和在這裏搜索,但似乎無法找到答案。 :/

求助:謝謝你們,顯然我在那裏犯了一些愚蠢的錯誤。我終於設法實現了代碼,並使用std :: function和std :: bind()來編譯和運行代碼。

+1

該消息對應哪一行? –

+2

'show'是什麼? –

+0

應該被稱爲「函數指針的無效使用」 –

回答

1

類型的Menues["0.1"].show()是不是一個函數指針。這是針對特定對象調用show()的結果。看來,你的show()函數返回int。嘗試以任何形狀或形式將功能推入void(*)(),您將沒有多少樂趣!

您可能正在尋找的是std::function<void()>,它可以用來調用無函數對象,即可以不帶參數調用的東西。你想傳遞的函數似乎是一個成員函數,因此它實際上有一個參數,隱式地通過this指針。你也想忽略std::function<void()>會很樂意爲你做的返回類型。也就是說,你的nextAction載體將被宣佈爲

std::vector<std::function<void()> nextAction; 

然而,實際上正確的對象添加show功能,您還需要構建一個suitbale std::function<void()>對象:因爲你的成員函數需要一個對象,你」將需要綁定對象的功能,例如:

Menues["0.0"].addNextAction(1, std::bind(&YMenu::show, &Menus["0.1"])); 

另外請注意,使用nextAction[index]纔有效,如果index < nextAction.size()這種操作,即之前,std::vector<T>不會自動調整到適當大小,以適應新的指標:即必須是明確的std::vector<T>

1

Menus["0.1"].show()你是調用的函數。

除非您最終調用成員函數指針時實際上有對象實例,否則您也不能存儲指向成員函數的指針,就像您試圖執行的操作一樣。我建議你看看std::functionstd::bind

std::vector<std::function<void()> nextAction; 
nextAction.push_back(std::bind(&YMenu::show, &Menus["0.1"])); 
1

而不是使用C風格的函數指針,使用std::function組合和std::bind如下:

std::vector<std::function<void()> > nextAction; 

void YMenu::addNextAction(int index, std::function<void()> Action) 
{ 
    nextAction[index] = Action; 
} 

Menus["0.0"].addNextAction(1, std::bind(&YMenu::show, &Menus["0.1"]));