Другие языки программирования и технологии
Как правильно передать указатель на функцию
Как правильно передать указатель на не статическую функцию-член класса вида 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 - что макрос понравился?
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 - что макрос понравился?
Если тебе сильно хочется, чтоб у ф-ции, куда передаётся указатель на ф-цию-член класса был указанный тобой вид, то можно определить этот указатель таким образом (использую код, который написал 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;
}
Так более полиморфно, но и писать больше. Может пригодиться, если мы выбираем метод не на этапе компиляции, а на этапе выполнения (позднее связывание) .
....
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;
}
Так более полиморфно, но и писать больше. Может пригодиться, если мы выбираем метод не на этапе компиляции, а на этапе выполнения (позднее связывание) .
Похожие вопросы
- C++ Указатели и функции.
- Как передать матрицу в функцию?
- Функции и указатели подскажите
- Как передать функцию в качестве параметра другой функции на C++?
- Список с использованием указателей на Си
- С++ Передать в функцию квадратную матрицу и вычислить сумму элементов на ее главной диагонали и вернуть эту сумму.
- Два вопроса про указатели в С++ внутри.
- Вопрос про указатели в С++ внутри
- СЛОЖНА! С++ Начал читать про указатели. Скопилось куча вопросов. Помогите!
- Есть ли смысл максимально стараться передать в функции ссылки на объекты, а не создавать их копии?