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

c++) а... как сделать так?

class AnyClass { void class_fun( void* p ) {} };void any_fun( ???pClassFun ){ pClassFun( .. );}как передать через параметр адрес функции класса (и можно ли)?типа так:{ AnyClass c; any_fun( c.class_fun );}
Проще передать адрес экземпляра класса, а внутри уже вызвать нужную функцию этого класса.
Дмитрий Лавренов
Дмитрий Лавренов
2 802
Лучший ответ
#include <stdio.h>

class Foo
{
public:
Foo(int value) : m_value(value)
{
printf("Foo::Foo(%d)\n", m_value);
}

~Foo()
{
printf("Foo::~Foo(), m_value = %d\n", m_value);
}

void fun1(void *p)
{
printf("Foo::fun1(%.8X), m_value = %d\n", p, m_value);
}

void fun2(void *p)
{
printf("Foo::fun2(%.8X), m_value = %d\n", p, m_value);
}

void fun3(void *p)
{
printf("Foo::fun3(%.8X), m_value = %d\n", p, m_value);
}

protected:
int m_value;
};

void CallFun1(Foo &rv, void (Foo::*pf)(void*), void *p)
{
(rv.*pf)(p);
}

void CallFun2(Foo *pv, void (Foo::*pf)(void*), void *p)
{
(pv->*pf)(p);
}

int main(int argc, _TCHAR* argv[])
{
Foo a(1), b(2);

int i, j, k;

printf("&i = %.8X\n", &i);
printf("&j = %.8X\n", &j);
printf("&k = %.8X\n", &k);

CallFun1(a, &Foo::fun1, &i);
CallFun1(a, &Foo::fun2, &j);
CallFun1(a, &Foo::fun3, &k);

CallFun2(&b, &Foo::fun1, &i);
CallFun2(&b, &Foo::fun2, &j);
CallFun2(&b, &Foo::fun3, &k);

return 0;
}
// end

обявление указателя на функцию-член (не статическую)
void (Foo::*pf)(void*)

Для применения этого указателя нужен объект этого класса.
обычное применение функции-члена через оператор ., или оператор -> для указателя на объект.
Foo a, *pa;
a.fun1(NULL);
pa->fun1(NULL);

применение указателя
void (Foo::*pf)(void*);
(a.*pf)(NULL);
(pa->*pf)(NULL);

Поскольку функция-член имеет в качестве параметра некий указатель, то его также нужно передать для применения.
Семья Дятловы
Семья Дятловы
21 360
Статические функции-члены можно передавать как обычные.
Чтобы сделать то, что ты хочешь, нужно кроме адреса функции-члена передать еще и объект, потому, что адрес объекта
в нестатическую функцию неявно идет первым аргументом...
Денис Смирнов
Денис Смирнов
18 724