Voila le code qui correspondrait à l'exemple du haut :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
class Interpreter;
typedef (Interpreter::*read_func)(std::vector<std::string>);
class Interpreter
{
protected:
std::map<std::string,read_func> funcTab; // tableau associant mot clef et fonctions membres
virtual void initFuncTab() = 0; // initialisation du tableau d'association
// lance la fonction de traitement correspondant à la commande
bool readCommand(const std::string& command, std::vector<std::string> params) {
std::map<std::string,read_func>::const_iterator element = funcTab.find(command);
if ( element != funcTab.end() )
return (element->second)(params);
return false;
}
public:
Interpreter() { initFuncTab(); }
~Interpreter() {}
};
class Server
{
protected:
virtual void readData(std::string data) = 0; //lit les donnes reçues
//virtual fonction_de_traitement1
//virtual fonction_de_traitement2
// ...
public:
Server() {}
~Server() {}
};
class ServerCom : public Server, Interpreter
{
protected:
//lance la fonction de traitement 1 avec des paramètres sous forme de chaine de caractères
bool launchTraitement1(std::vector<std::string> params) {
//Si params corrects
//lancer fonction_de_traitement1( param1, param2 ...) et retourner true;
//Sinon retourner false
}
bool launchTraitement2(std::vector<std::string> params) { // ... }
// ...
void readData(std::string data) {
std::vector<std::string> params;
std::string command;
//parser data et stocker dans params
//retirer le premier element de params et le stocker dans command
if (!readCommand(command,params))
{
//Traiter l'erreur
}
}
virtual void initFuncTab() {
funcTab["COMMAND1"] = &ServerCom::launchTraitement1;
funcTab["COMMAND2"] = &ServerCom::launchTraitement2;
// ...
}
public:
ServerCom() {}
~ServerCom() {}
} |
Je n'ai pas détaillé Server. Ca aurait pu être n'importe quel autre classe recevant des données sous forme de chaine de caractères.
Ce qui pose problème c'est
return (element->second)(params);
dans la fonction readCommand de la classe Interpreter avec l'erreur de nombre d'argument
et
1 2 3
| funcTab["COMMAND1"] = &ServerCom::launchTraitement1;
funcTab["COMMAND2"] = &ServerCom::launchTraitement2;
// ... |
dans la fonction initFuncTab de la classe ServerCom où c'est le type Interpreter::* qui est attendu au lieu de ServerCom::* .
J'attends vos conseils. Merci
Partager