Добрый день, уважаемые Гуру!
Есть к Вам два вопроса.
Первый теоретический и задается очень коряво (простите):
Имеем следующий код:
class MyClass {
public:
void method ( ) { };
};
int main () {
MyClass a, b;
a.method();
b.method();
return 1;
}
Гарантируется ли что вызовы
a.method() и b.method(); формально "вызывают" один и тот-же код,
т.е. "условно" &a.method == &b.method.
int main () {
...
MyClass a, b;
a.method();
00411A1E lea ecx,[a]
00411A21 call MyClass::method (4112CBh) ;
b.method();
00411A26 lea ecx,[b]
00411A29 call MyClass::method (4112CBh)
return 1;
00411A2E mov eax,1
}
и второй вопрос "практический":
#include <iostream>
#include <map>
//////////////////////////////////////////////////
class MyClass {
public:
enum what_method { method1, method2, method3, method4, };
////
void call ( what_method method ) {
//// от этой проверки хотелось бы избавиться
if ( m_method_map.empty() ) {
m_method_map [method1] = &MyClass::m1;
m_method_map [method2] = &MyClass::m2;
m_method_map [method3] = &MyClass::m3;
m_method_map [method4] = &MyClass::m4;
}
// вызов нужного метода
(this->*m_method_map [method]) ();
}
protected:
void m1 ( ) { std::cout << "m1" << std::endl; };
void m2 ( ) { std::cout << "m2" << std::endl; };
void m3 ( ) { std::cout << "m3" << std::endl; };
void m4 ( ) { std::cout << "m4" << std::endl; };
static std::map < what_method, void ( MyClass::*) () > m_method_map;
};
std::map < MyClass::what_method, void ( MyClass::*) () > MyClass::m_method_map;
//// как вот тут заполнить m_method_map парами типа
//// method1 - m1
//// method2 - m2 ... и т.д.
////////////////////////////////////////
int main () {
MyClass cl;
cl.call ( MyClass::method1 );
return 0;
}
Заранее благодарен