2012-02-22 78 views
3

我想創建這樣一個接口:
如何通過接口存儲成員函數指針

class IMother { 
public: 
    // This getter return a map which contains a member functer pointer 
    virtual map<string, void (IMother::*)()> getMap() const = 0; 
    virtual ~IModule() {}; 
}; 

然後,創建一個孩子,並覆蓋吸氣,以返回地圖只包含Child_1成員函數指針

class Child_1 : public IMother { 
private: 
    map<string, void (Child1::*)(int)> _map; 

public: 
    void do_something_1(int a) { 
    // Something... 
    } 

    void do_something_2(int a) { 
    // Something... 
    } 

    virtual map<string, void (Child1::*)(int)> getMap() { 
    _map["do_1"] = &do_something_1; 
    _map["do_2"] = &do_something_2; 
    return _map; 
    } 

,我想我就可以讓它工作,因爲,在我的腦海,我想Child1是IMother所以我必須編寫正確的,但我不能..

int main() { 
    IMother *mother = new Child_1; 

    // I don't know how run a method through a map 
    mother->getMap["do_1"](42); // Not seem to work 
    return 0; 
} 

有沒有辦法通過接口存儲成員函數指針?

+0

使用C++ 11,可以將'override'屬性添加到'Child1 :: getMap',如果你這樣做,編譯器會警告你,你不是重寫。 – 2012-02-22 12:53:58

回答

0

有幾個問題:所以你的例子不能用錯誤編譯指針

  1. 首先分配給成員是不正確的:

    此:

    _map["do_1"] = &do_something_1; 
    _map["do_2"] = &do_something_2; 
    

    應該成爲:

    _map["do_1"] = &Child1::do_something_1; 
    _map["do_2"] = &Child1::do_something_2; 
    
  2. 其次,IMother和Child1上的getMap()的返回類型不同,因爲一個不帶參數和一個指向IMother成員的指針,另一個帶一個int並且是一個指向Child1成員的指針。這兩個差異導致返回類型在C++中不同。

    IMother:

    map<string, void (IMother::*)()> 
    

    Child1:

    由於返回類型是不同的Child1還沒有覆蓋所有IMother定義的純虛函數,所以你不能實例Child1的實例。

  3. 第三,您的成員函數調用不正確。調用之前,成員函數仍然需要提供「成員」。例如

    class SomeClass; 
    typedef void (SomeClass::* SomeClassFunction)(void); 
    
    void Invoke(SomeClass *pClass, SomeClassFunction funcptr) { 
        (pClass->*funcptr)(); 
    }; 
    

話雖這麼說,我想看看STL的功能頭。 stl函數庫允許你編寫以下代碼,稍後使用比內置C++語法更簡單的語法來調用它們:

typedef std::function<float (float)> MyFuncType; 

map<sting, MyFuncType> myFuncs; 
myFuncs["myCustomSin"] = &SomeClass::SomeCustomSinFunc; 
myFuncs["cSin"] = &sin; 
0

IMother::getMapIChild::getMap有不同的返回類型。只有在返回類型爲covariant的情況下才允許。儘管IMotherIChild是協變的,std::map<...IMother...>std::map<...IChild..>都不是。這裏invalid covariant return type