2012-06-14 40 views
10

Zrobiłem mapę funkcji. wszystkie te funkcje są nieważne i otrzymują pojedynczy parametr ciągu.Mapa funkcji C++

Kod:

void f1(string params){...} 
void f2(string params){...} 
void f3(string params){...} 

map<string , void*> funcMap; 

funcMap["f1"] =(void*)&f1; 
funcMap["f2"] =(void*)&f2; 
funcMap["f3"] =(void*)&f3; 

jak mogę wywołać funkcję? Próbowałem następnego kodu, ale id nie działa:

void (*func)(string) = &funcMap[commandType]; 
func(commandParam); 

otrzymuję komunikat o błędzie:

Server.cpp:160:46: error: cannot convert ‘void**’ to ‘void (*)(std::string) {aka void (*)(std::basic_string<char>)}’ in initialization 

Odpowiedz

16
typedef void (*pfunc)(string); 

map<string, pfunc> funcMap; 
funcMap["f1"] = f1; //and so forth 

a następnie zadzwonić:

pfunc f = funcMap[commandType]; 
(*f)(commandParam); 

W ogóle, dlaczego wyrzucić bezpieczeństwa typu? Jeśli jest to mapa wskaźników funkcji, zadeklaruj ją jako jedną.

+0

dzięki! zadziałało :) – kakush

+0

Zaakceptuj odpowiedź, a następnie :) Tak właśnie mówimy dzięki za SO. –

+0

Dlaczego nie dostać kompilator do podjęcia ciepła? –

0

&funcMap[commandType]

tylko kropla &. Twój błąd kompilacji był tutaj użyteczny. Po prawej stronie miał on void**, ponieważ wziął on adres wskaźnika funkcji. Nie chcesz tam dwóch poziomów pośrednictwa.

+0

próbował . nie zadziałał – kakush

+0

zadzwonić z (* f) oraz – djechlin

2

Dlaczego nie mieć tych osobnych klas.

Następnie stosuj metody jako wirtualne.

Możesz wtedy mieć mapę między ciągiem a klasą bazową.

tj

class Someoperation 
{ 
    virtual void Doit() = 0; 
}; 

map<string, Someopertion> ops; 

Następnie

class MyOp : public Someoperation 
{ 
    void Doit() { /* Some code here */} 
}; 

Wystarczy dodać obiekty

ops["Hello"] = MyOp(); 

następnie nazwać

ops["Hello"].Doit(); 
+0

"ops [" Hello "] = MyOp();" spowoduje błąd, ponieważ nie ma przypisania od MyOp do Someoperation. Aby ta technika działała, potrzebna jest mapa Wskaźników niektórych operacji. A to wymaga alokacji dynamicznej i wszystkich rodzajów problemów związanych z życiem obiektu. –

+0

1. Dziedziczenie. 2. Nie używając wskaźników –

+1

Spróbuj skompilować. Nie możesz mieć mapy typu abstrakcyjnego, ponieważ jest to błąd w jej konstrukcji. –