2012-03-07 8 views
0

少し問題があります!関数ポインタ+マップ+イテレータ+クラス


class AKSH 
{ 
private: 
typedef map<string,void (AKSH::*)()> t_list; 
public: 
t_list list; 
AKSH(){...} 

}; 

AKSH sh; 

void AKSH::doWork() 
{ 
map<string,void (AKSH::*)()>::iterator it; 
... 
if(it != list.end()) 
{ 
(sh.*it->second)(); 
} 

int main() 
{ 
AKSH aksh; 
aksh.doWork(); 
} 

Iは、2つのオブジェクト(aksh、SH)を生成しなければなりません。どのようにしてイテレータでakshを使うことができますか、またはラインに間違いがありますか(sh。* it-> second)?

+1

この問題についてはわかりませんが、すぐに 'std :: function'をすぐにチェックアウトしてください。 :-)非常に便利になる – Kos

+1

'void(AKSH :: *)()'は関数へのポインタを宣言しません。これは、メンバ関数へのポインタを宣言します。それらは[非常に異なるもの](http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.1)です。 –

答えて

0

私は、これはあなたがしたい

#include <iostream> 
#include <map> 

using namespace std; 

class AKSH 
{ 
private: 
    typedef map<string,void (AKSH::*)()> t_list; 
public: 
    t_list list; 
    AKSH(){} 
    void doWork(); 
}; 

AKSH sh; 

void AKSH::doWork() 
{ 
    map<string,void (AKSH::*)()>::iterator it; 
    if(it != list.end()) 
    { 
     // here it comes. 
     (this->*(it->second))(); 
    } 
} 

int main() 
{ 
    AKSH aksh; 
    aksh.doWork(); 
} 
+0

公式ドキュメントについてiteratorを使ってstd :: mapの値にアクセスするのは2番目ではありません(* it).2番目はありません:http://www.cplusplus.com/reference/stl/map/ –

+0

動作しません!エラー:基本オペランドの ' - >'は非ポインタ型です 'std :: pair ' –

+0

上記のように、 (* it)は、マップ –

1

されるべきだと思う:(this->*(it->second))();

しかし、あなたはそれを追加する前に、くださいthis pageを読んでください!あなたがそのページを読んでおらず、あなたがメンバー関数へのポインタを使い続けているなら、私はあなたの髪を裂くことを保証します。

#include <map> 
#include <string> 
#include <iostream> 

class AKSH 
{ 
private: 
typedef std::map<std::string,void (AKSH::*)()> t_list; 
const std::string name; 
public: 
t_list list; 
void add() { std::cout << name << ": " << __FUNCTION__ << "\n"; } 
void sub() { std::cout << name << ": " << __FUNCTION__ << "\n"; } 
void doWork(const std::string&); 
AKSH(const std::string& name) :name(name) { 
    list["add"] = &AKSH::add; 
    list["sub"] = &AKSH::sub; 
} 
}; 

AKSH sh("sh"); 

void AKSH::doWork(const std::string& str) 
{ 
AKSH::t_list::iterator it; 
it = list.find(str); 
if(it != list.end()) 
{ 
    (this->*(it->second))(); 
} 
else 
{ 
    std::cout << name << ": No such command: " << str << "\n"; 
} 
} 
int main() 
{ 
AKSH aksh("aksh"); 
aksh.doWork("add"); aksh.doWork("sub"); 
sh.doWork("add"); sh.doWork("sub"); 
sh.doWork("div"); aksh.doWork("mul"); 
} 
+0

ありがとう!私はその論文を読むでしょう –