2011-06-26 61 views
0

我有兩個繼承類。我想讓這些類將它們的函數存儲在一張地圖中。我怎樣才能通過鍵創建查找功能?函數的繼承會起作用(MyClass_2沒有自己的doSmth()函數,它應該添加來自MyClass的doSmth())?我嘗試低於:C++ find()用於映射成員函數

template<class T> 
class Class1 
{ 
    typedef void(T::*MyFunction)(); 
    map<string, MyFunction> functionMap; 
    public: 
     void addFunc(string funcName, MyFunction function) { 
      functionMap.insert(pair<string, MyFunction>(funcName, function)); 
     } 

     bool findFunc(string key) { 
      typename map<string, MyFunction>::iterator it; 

      it = functionMap.find(key.c_str()); 
     } 
}; 


class MyClass { 

    Class1<MyClass> class1; 

    void addFunc() { 
     class1.addFunc("Func1", &MyClass::doSmth); 
    } 

    void findAndCallFunc(string key) { 
     class1.findFunc(key); 
    } 

    void doSmth(); 

}; 

class MyClass_2: MyClass { 

    Class1<MyClass_2> class1; 

    void addFunc() { 
     class1.addFunc("Func1", &MyClass_2::doSmth); 
    } 

} 

編輯:我測試了我的PROGRAMM。有用。我的問題是,如果我從MyClass_2的對象調用fundAndCallFunc。它不需要MyClass_2的class1,而是MyClass的class1。 我應該改變什麼?

回答

1

正如克里斯說,你findFunc應該返回實際的功能:

MyFunction findFunc(string key) 
{ 
    const map<string, MyFunction>::const_iterator it = functionMap.find(key); 
    return it == functionMap.end() ? NULL : it->second; 
} 

此外,如果你只在函數指針存儲到一個成員函數,你就失去了實際物體的軌道(因此你可以讓你的地圖變成靜態的!)。也許你還應該保存this指針的對象,即讓你的地圖是這樣的:

std::map<std::string, std::pair<T*, MyFunction> > functionMap; 

addFunc你會說

functionMap.insert(std::make_pair(funcName, std::make_pair(this, function))); 

用法:假設it = functionMap.find("key")。那麼你可以說:

MyClass * const p = it->second.first; 
MyFunction  f = it->second.second; 

p->*f(); // invoke -- yes, it's operator->*() in action 
1

你這裏有兩個顯而易見的問題:

  • findFunc方法只查找功能,它不會用它做任何事情(試圖調用或返回的方法指針),其聲明爲返回bool而非MyFunction - 不知道你想要它做的

  • doSmth方法是MyClass的私人的東西,所以你不能在MyClass_2訪問它。您需要將其保護或公開。

相關問題