2012-06-14 10 views
10

Ich habe eine Karte von Funktionen gemacht. Alle diese Funktionen sind ungültig und erhalten einen einzelnen String-Parameter.Karte der Funktionen C++

Code:

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; 

Wie rufe ich eine Funktion? Ich habe versucht, den nächsten Code, aber id nicht funktioniert:

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

Ich bekomme diese Fehlermeldung:

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

Antwort

16
typedef void (*pfunc)(string); 

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

Und dann rufen:

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

Im Allgemeinen warum Typsicherheit wegzuwerfen? Wenn es sich um eine Karte von Funktionszeigern handelt, deklarieren Sie sie als eine.

+0

danke! es hat funktioniert :) – kakush

+0

Akzeptiere die Antwort, dann :) So sagen wir Danke hier bei SO. –

+0

Warum nicht den Compiler die Hitze nehmen? –

0

&funcMap[commandType]

einfach die & fallen. Dein Kompilierfehler war hier nützlich. Es hatte eine void** auf der rechten Seite, die ist, weil Sie die Adresse eines Funktionszeigers genommen. Sie wollen nicht zwei Ebenen der Indirektion dort.

+0

versucht . hat nicht funktioniert – kakush

+0

Anruf mit (* f) sowie – djechlin

2

Warum nicht nur diese als separate Klassen haben.

Dann haben Sie die Methoden als virtuell.

Sie können dann eine Zuordnung zwischen der Zeichenfolge und der Basisklasse haben.

heißt

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

map<string, Someopertion> ops; 

Dann

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

Fügen Sie einfach Objekte

ops["Hello"] = MyOp(); 

dann nennen es

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

Die "ops [" Hallo "] = MyOp();" wird fehlgeschlagen, da keine Zuordnung von MyOp zu Someoperation besteht. Sie benötigen eine Karte von Someoperation-Zeigern, damit diese Technik funktioniert. Und das erfordert dynamische Zuweisung und alle Arten von Problemen mit der Lebensdauer von Objekten. –

+0

1. Vererbung. 2. Verwenden Sie keine Zeiger –

+1

Versuchen Sie, zu kompilieren. Sie können keine Karte des abstrakten Typs haben, da es ein Fehler ist, einen zu konstruieren. –