выглядит хорошо для меня, но тот факт, что descrToFuncMap
необходимо объявить static
, если вы собираетесь инициализировать его из статической функции Initialize()
.
Если вы хотите убедиться, что Initialize()
вызывается и вызывается только один раз, вы можете использовать шаблон Singleton. По сути, если вы не выполняете многопоточность, это просто означает, что descrToFuncMap
оборачивается внутри своего собственного класса (например, скажем FuncMap
) с помощью закрытого конструктора, который вызывает Initialize()
. Затем вы добавляете static
локальную переменную типа FuncMap
к Processor::Process()
- поскольку переменная static
, она сохраняется и инициализируется только один раз.
Пример кода (теперь я понимаю, что friend
здесь на самом деле не нужен):
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;
}
}
Это не «истинный» шаблон Singleton, поскольку различные функции могут создавать свои собственные, отдельные экземпляры FuncMap
, но этого достаточно для того, что вам нужно. Для «истинного» Singleton вы бы объявили конструктор FuncMap
закрытым и добавили статический метод, скажем getInstance()
, который определил единственный экземпляр как переменную static
и вернул ссылку на него. Processor::Process()
будет использовать это с
FuncMap& fm = FuncMap::getInstance();