Страницы

Поиск по вопросам

четверг, 19 марта 2020 г.

Поле класса - указатель на метод

#cpp #указатели


Здравствуйте!

В одном из ответов увидел, что поле класса определяется таким образом:

    void(My::*z)( int );


Поясните, пожалуйста такую запись. В каких случаях она используется? 
    


Ответы

Ответ 1



В каких случаях она используется? Такое поле используется в случаях, когда есть какая-то внешняя зависимость на метод класса. В моем примере эта зависимость от внутреннего состояния объекта. Без "указателя на метод" все равно пришлось бы вводить дополнительную переменную State. Но в таком случае, логика метода была бы не так очевидна. Вот тот же пример без z: class My{ int State; public: My( void ) : State( 0 ){} void state( int x ){ switch( State ){ case 0: if( x == 1 ){ State = 1; } break; case 1: if( x == 2 ){ State = 2; }else{ State = 1; } break; case 2: if( x == 3 ){ State = 0; } break; } } } Очевидно, в таком варианте запутаться в номерах состояний гораздо проще, чем в исходном. Для лучшей ориентации по коду в таких случаях вводят enum: class My{ enum{ state_1 = 0, state_2, state_3 }; int State; public: My( void ) : State( state_1 ){} void state( int x ){ switch( State ){ case state_1: if( x == 1 ){ State = state_2; } break; case state_2: if( x == 2 ){ State = state_3; }else{ State = state_1; } break; case 2: if( x == 3 ){ State = state_1; } break; } } } Но на мой взгляд, даже в таком случае исходный вариант выгоднее для понимания.

Комментариев нет:

Отправить комментарий