Attend bien pour moi, mais pour le fait que descrToFuncMap
doit être déclarée static
si vous avez l'intention de l'initialiser à l'intérieur de la fonction statique Initialize()
.
Si vous voulez vous assurer que Initialize()
est appelé, et qu'il est appelé une seule fois, vous pouvez utiliser le motif Singleton. Fondamentalement, si vous ne faites pas le multithreading, cela signifie juste l'emballage descrToFuncMap
à l'intérieur de sa propre classe (appelée par exemple FuncMap
) avec un constructeur privé qui appelle Initialize()
. Ensuite, vous ajoutez une variable locale static
de type FuncMap
à Processor::Process()
- car la variable est static
, elle persiste et n'est initialisée qu'une seule fois.
Exemple code (je me rends compte maintenant que friend
est pas vraiment nécessaire ici):
class Processor {
private:
typedef double (MyClass::*MemFuncGetter)();
class FuncMap {
public:
FuncMap() {
descrToFuncMap["X"]=&MyClass::GetX;
descrToFuncMap["SomethingElse"]=&MyClass::GetSomethingElse;
descrToFuncMap["RR"]=&MyClass::GetRR;
descrToFuncMap["T"]=&MyClass::GetT;
}
// Of course you could encapsulate this, but its hardly worth
// the bother since the whole class is private anyway.
map<std::string, MemFuncGetter> descrToFuncMap;
};
public:
void Process(Myclass m, string);
};
void Processor::Process(MyClass ms, const std::string& key) {
static FuncMap fm; // Only gets initialised on first call
map<std::string, Getter>::iterator found=fm.descrToFuncMap.find(key);
if(found!=fm.descrToFuncMap.end()) {
MemFuncGetter memFunc=found->second;
double dResult=(ms).*memFunc();
std::cout<<"Command="<<key<<", and result="<<result<<std::end;
}
}
Ce n'est pas le « vrai » modèle Singleton comme des fonctions différentes peuvent créer leurs propres instances distinctes de FuncMap
, mais c'est assez pour ce dont tu as besoin. Pour "true" Singleton, vous devez déclarer le constructeur FuncMap
privé et ajouter une méthode statique, par exemple getInstance()
, qui a défini l'instance unique comme une variable static
et renvoyé une référence à cela. Processor::Process()
serait alors l'utiliser avec
FuncMap& fm = FuncMap::getInstance();
En fait, je pense que la carte est plus agréable que si une chaîne-else. Il vous donne un bon crochet pour stocker d'autres méta-informations plus tard si le besoin s'en fait sentir - il suffit d'étendre le type de valeur du pointeur de fonction à une structure contenant un pointeur de fonction plus toutes les autres informations dont vous avez besoin. –
Je suis d'accord, a l'air mieux, mais plus difficile à comprendre pour un développeur moins expérimenté. –