2014-10-07 47 views
-1

我目前正試圖找出開關語句的替代方法,因爲我有開關語句的程序變得非常漫長和令人困惑。因此,我認爲使用函數指針數組是個好主意。我正在使用C++和qt。但是當我嘗試和實施時,我收到以下錯誤。試圖找出開關語句的替代方法

cannot convert 'CheckPl::comA' from type 'void (CheckPl::)()' to type 'void (*)()'

這將不勝感激,如果有人能幫助我這個,或者至少指向我正確方向。

+2

看來你不能將指針轉換成'CheckPI'的成員函數,變成指向函數的指針。如果你[顯示了一些代碼](http://stackoverflow.com/help/mcve),我們甚至可能幫助你! – Angew 2014-10-07 08:21:03

回答

1

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; 
} 

這是很容易理解(在實現和客戶端代碼),它是模塊化的,可測試的(您可以單獨測試每個案例)和可擴展的(如果您需要新案例,只添加案例並將其添加到向量);它也不使用任何指針。

0

指向成員函數的指針必須存儲在適當類型的變量中。指向成員函數的指針與指向函數的指針不兼容。

void (CheckPl::*mptr)() = &CheckPl::comA; 

指向成員函數的指針需要一個實例用於調用對象。

CheckPl c; 
    CheckPl *cp = &c; 
    (c.*mptr)(); 
    (cp->*mptr)(); 

關於上述語法最難記的是額外的括號集是必需的。