我目前正試圖找出開關語句的替代方法,因爲我有開關語句的程序變得非常漫長和令人困惑。因此,我認爲使用函數指針數組是個好主意。我正在使用C++和qt。但是當我嘗試和實施時,我收到以下錯誤。試圖找出開關語句的替代方法
cannot convert 'CheckPl::comA' from type 'void (CheckPl::)()' to type 'void (*)()'
這將不勝感激,如果有人能幫助我這個,或者至少指向我正確方向。
我目前正試圖找出開關語句的替代方法,因爲我有開關語句的程序變得非常漫長和令人困惑。因此,我認爲使用函數指針數組是個好主意。我正在使用C++和qt。但是當我嘗試和實施時,我收到以下錯誤。試圖找出開關語句的替代方法
cannot convert 'CheckPl::comA' from type 'void (CheckPl::)()' to type 'void (*)()'
這將不勝感激,如果有人能幫助我這個,或者至少指向我正確方向。
switch語句的替代方法作爲程序我有開關語句變得非常漫長和令人困惑。
將每個大小寫塊提取到單獨的函數中;這樣,從10公里長的功能開關更改調度功能:
void dispatch_function()
{
switch(x)
{
case 1: do_case_1(); break;
...
case n: do_case_n(); break;
}
}
因此,我認爲這將是使用指針數組功能是一個好主意。
這不是一個好主意(特別是,不是你以這樣的方式 - 你正在解決xy problem)。在C++中,當您需要在相似條件下調用的多個函數時,您需要抽象接口。
你得到的客戶端代碼應該是這樣的:
std::vector<handlers> handlers; // filled with handler instances, one for each case
for(const auto& h: handlers) // replaces switch
if(h.fits_case(x)) // replaces case statement
{
h.do_case(x); // replaces case block
break;
}
由此可見,你的處理程序類應該從基類這樣繼承:
class handler_base
{
virtual bool fits_case(int x) = 0;
virtual void do_case(int x) = 0;
}
這是很容易理解(在實現和客戶端代碼),它是模塊化的,可測試的(您可以單獨測試每個案例)和可擴展的(如果您需要新案例,只添加案例並將其添加到向量);它也不使用任何指針。
指向成員函數的指針必須存儲在適當類型的變量中。指向成員函數的指針與指向函數的指針不兼容。
void (CheckPl::*mptr)() = &CheckPl::comA;
指向成員函數的指針需要一個實例用於調用對象。
CheckPl c;
CheckPl *cp = &c;
(c.*mptr)();
(cp->*mptr)();
關於上述語法最難記的是額外的括號集是必需的。
看來你不能將指針轉換成'CheckPI'的成員函數,變成指向函數的指針。如果你[顯示了一些代碼](http://stackoverflow.com/help/mcve),我們甚至可能幫助你! – Angew 2014-10-07 08:21:03