Страницы

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

понедельник, 9 декабря 2019 г.

Где может использоваться .* и ->*?

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


То есть .* - доступ к указателю на член класса и ->* - доступ к указателю на член
класса по указателю. Покажите на примерах.    


Ответы

Ответ 1



Вот далеко не полный список примеров: с сайта МС большая статья на codeproject аналогичный вопрос на SO ещё один да, все это на английском, но там есть примеры на с++, а он как известно и в Африке с++.

Ответ 2



Простенький пример: class My{ void(My::*z)( int ); // void state_1( int x ){ if( x == 1 ){ z = &My::state_2; } } void state_2( int x ){ if( x == 2 ){ z = &My::state_3; }else{ z = &My::state_1; } } void state_3( int x ){ if( x == 3 ){ z = &My::state_1; } } // public: My( void ) : z( &My::state_1 ){} void state( int x ){ (this->*z)( x ); } }; Здесь, в классе My имеется поле z, которое хранит текущее состояние объекта класса My. В зависимости от внешнего воздействия x, это состояние может меняться. Вот так обычная стейт-машина может становиться более понятной с "указателями на члены класса".

Ответ 3



Оператор (.) точка применяется к обычным объектам, например: class C{ pubic: int value; int method(); }; int main()... C c; // объект c.value = 3; // обращение к данным c.method(); // вызов метода то же относится к структурам: struct C{ pubic: int value; int method(); }; int main()... C c; // обьект c.value = 3; // обращение к данным c.method(); // вызов метода к объектам находящихся в памяти используется оператор (->) стрелка: class C{ pubic: int value; int method(); }; int main()... C * p; // указатель на обьект p = new C; // создаем объект в памяти c->value = 3; // обращение к данным c->method(); // вызов метода то же относится к структурам: struct C{ pubic: int value; int method(); }; int main()... C * p; // указатель на обьект p = new C; // создаем объект в памяти c->value = 3; // обращение к данным c->method(); // вызов метода оператор (->) стрелка применяется так же внутри класса к указателю (this), например: class C{ pubic: int value; int method(){ this->value = 10; // указатель на себя } };

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

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