Зависит ли от копмилятора "адрес" метода.
От: Аноним  
Дата: 21.10.05 12:12
Оценка:
Добрый день, уважаемые Гуру!
Есть к Вам два вопроса.

Первый теоретический и задается очень коряво (простите):
Имеем следующий код:
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;
}







Заранее благодарен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.