2011-06-26 4 views
0

私は継承を持つ2つのクラスを持っています。クラスに関数を1つのマップに格納できるようにしたい。キーで検索機能を作成するにはどうすればよいですか?関数の継承(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); 
    } 

} 

EDIT:私は私のプログラムの開発をテストしました。できます。私の問題は、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; 
} 

をあなたのマップを静的にすることができます!)。 addFunc

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

はあなたが

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

使い方を言う:it = functionMap.find("key")を仮定おそらく、あなたはまた、このようなあなたのマップを作る、すなわち、オブジェクトのthisポインタを格納する必要があります。次に、あなたは言うことができる:

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

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

あなたはここ2つの、すぐに明らかな問題があります。

  • あなたfindFunc方法はそれはそれで何も(それを呼び出すか、メソッドポインタを返すための試みを)やる、としない、機能を見上げてあなたはそれが

  • あなたdoSmth方法は、MyClassの中にプライベートで何をしたいのかわからないので、あなたはMyClass_2でそれにアクセスすることはできません - boolではなくMyFunctionを返すように宣言。あなたはそれを保護されたものにする必要があります。

関連する問題