Другие языки программирования и технологии

Как правильно передать указатель на функцию

Как правильно передать указатель на не статическую функцию-член класса вида long(CALLBACK my_class::*func_ptr)(int arg) т.е. привести его к виду long(CALLBACK *func_ptr)(int arg)
1 статические функции класса не являются функциями-членами. Они просто лежат в пространстве имен класса.
2 функции-члены отличаются от всего остального тем, что им неявным образом передается указатель на объект класса. Именно поэтому они знают с каким объектом работать, и имеют доступ к переменным-членам объекта.

Если собрался куда то передавать указатель на функции-члены, то этого недостаточно. Каким образом эти самые функции-члены узнают (получат указатель) про объект? Пока это вопрос не решишь, передавать указатель на функции-члены смысла не имеет.

class my_class
{
public:
my_class() {}
~my_class() {}

long CALLBACK methodA(int arg)
{
TRACE(_T("my_class::methodA(%d)\n"), arg);
return 0;
}
long CALLBACK methodB(int arg)
{
TRACE(_T("my_class::methodB(%d)\n"), arg);
return 0;
}
long CALLBACK methodC(int arg)
{
TRACE(_T("my_class::methodC(%d)\n"), arg);
return 0;
}
};

void function(my_class *obj, long (CALLBACK my_class::*method)(int))
{
long l = (obj->*method)(0);
}

int main()
{
my_class a;
function(&a, &my_class::methodA);
function(&a, &my_class::methodB);
function(&a, &my_class::methodC);

return 0;
}

PS: CALLBACK - что макрос понравился?
Ermek Nusipkoja
Ermek Nusipkoja
21 360
Лучший ответ
Если тебе сильно хочется, чтоб у ф-ции, куда передаётся указатель на ф-цию-член класса был указанный тобой вид, то можно определить этот указатель таким образом (использую код, который написал HANDLE)
....
int main()
{
long (CALLBACK my_class::*func)(int); //определили указатель на ф-цию-член с нужной сигнатурой
my_class a;

func= &my_class::methodA; //определили смещение метода в объекте класса
function(&a,func);

func= &my_class::methodB;
function(&a,func);

func= &my_class::methodC;
function(&a,func);

return 0;
}
Так более полиморфно, но и писать больше. Может пригодиться, если мы выбираем метод не на этапе компиляции, а на этапе выполнения (позднее связывание) .
Arlan Egizbaev
Arlan Egizbaev
9 759