Указатели на функции-члены не часто встречаются в программистской практике,
но иногда они оказываются очень полезными. Они аналогичны указателям на
обычные функции, но при вызове функции-члена нужно передавать объект
(помимо аргументов). Синтаксис таких указателей описывается следующим примером:
#include<iostream>usingnamespace std;
class Test
{
public:
void foo()
{
cout <<"Test::foo called"<< endl;
}
};
int main()
{
//объявляем тип указателя:typedefvoid(Test::* pToFunc)();
//создаём объект этого типа и инициализируем его:
pToFunc pt = &Test::foo;
//создаем объект класса Test
Test test;
//с помощью объекта вызываем функцию-член, адрес который хранится в pt//обратите внимание на *(test.*pt)();
// Можно и по указателю:
Test *test2 = new Test;
(test2->*pt)();
delete test2;
}
Есть в с++ одна интересная особенность: в этом языке не существует типа для результата
работы функций (test.*pt). К нему можно только применить оператор вызова функции.
В стандарте языка C++ сказано: "Если результатом выполнения операторов .* и ->* является функция, этот результат может быть использован лишь в качестве операнда оператора вызова функции ()".
ITcrusader >Не понимаю, а зачем??? Я здесь увидел лишь альтернативный способ вызвать функцию, причем, способ нечитабельный) Может я что-то упустил из вида?
Я для консольных команд так делал.
В консольную команду можно биндить практически любой метод класса. Не затачивая его специально для этого. Так что это очень полезная штука.
> Указатель на метод класса? Извращение же.
Возможно, ща начнется ....
> Если тебе нужен указатель на метод класса - ты пишешь неправильный код.
Это всего лишь один из инструментов при написании программы. Причем хороший инструмент.
Хороший прог видит такие вещи сразу.
Вполне нормальная практика. Пользуюсь и довольно часто. У себя обвернуты указатели в шаблоны и фабричную функцию создания, дабы облегчить вызовы. Есть хорошая статья на эту тему: http://www.rsdn.ru/article/cpp/delegates.xml
Неплохо было бы написать об подводных камнях этих указателей. Например, разный размер в зависимости от видов наследования. Или то, что приведение указателя на метод производного класса к указателю на базовый может быть сделано только через reinterpret_cast, что UB.
Ну, допустим я никудышный прог. Но за 6 лет использования C++ ни разу не довелось использовать данную возможность, о предоставлении которой языком я знал.
Мне не хотелось бы разводить холивар (если бы хотел, создал бы тему типа "C++ - не более чем извращенный способ прострелить себе ногу" или "apple рулит, Android - говно)" или "открывающая скобка в определениях функций должна быть в одной строке с заголовком функции" :) )
На тему целесообразности использования указателей на функции члены класса ответ я ищу, в том числе, самостоятельно. НО пока не нашел достойного примера применения. Если таков имеется, с удовольствием бы глянул:)