以下代码用于测试函数指针,在不用类的时候可以正常调用函数指针,包装到类中编译时会报以下错:
error C3867: “CFuncPoint::max”: 函数调用缺少参数列表;请使用“&CFuncPoint::max”创建指向成员的指针
error C3867: “CFuncPoint::min”: 函数调用缺少参数列表;请使用“&CFuncPoint::min”创建指向成员的指针
假如按编译提示改成fp.calcValue(&CFuncPoint::max, 3, 4)和fp.calcValue(&CFuncPoint::min, 2, 5)的话又报以下错:
error C2664: “CFuncPoint::calcValue”: 不能将参数 1 从“int (__thiscall CFuncPoint::* )(int,int)”转换为“int (__cdecl *)(int,int)”
error C2664: “CFuncPoint::calcValue”: 不能将参数 1 从“int (__thiscall CFuncPoint::* )(int,int)”转换为“int (__cdecl *)(int,int)”
问一下该怎么将类的成员函数当成函数指针传递给其它函数?
//FuncPoint.h
class CFuncPoint
{
public:
int max(int a, int b);
int min(int a, int b);
void calcValue(int (*p)(int, int), int a, int b);
};
//FuncPoint.cpp
//函数指针测试
#include “FuncPoint.h”
#include <iostream>
int CFuncPoint::max(int a, int b)
{
printf(“a = %d, b = %d, max: “, a, b);
return a > b ? a : b;
}
int CFuncPoint::min(int a, int b)
{
printf(“a = %d, b = %d, min: “, a, b);
return a < b ? a : b;
}
void CFuncPoint::calcValue(int (*p)(int, int), int a, int b)
{
int rtn = p(a, b);
printf(“%d\n”, rtn);
}
void main(int argc, void* args[])
{
CFuncPoint fp;
fp.calcValue(fp.max, 3, 4); // <–此处报错
fp.calcValue(fp.min, 2, 5); // <–此处报错
getchar();
}
error C3867: “CFuncPoint::max”: 函数调用缺少参数列表;请使用“&CFuncPoint::max”创建指向成员的指针
error C3867: “CFuncPoint::min”: 函数调用缺少参数列表;请使用“&CFuncPoint::min”创建指向成员的指针
假如按编译提示改成fp.calcValue(&CFuncPoint::max, 3, 4)和fp.calcValue(&CFuncPoint::min, 2, 5)的话又报以下错:
error C2664: “CFuncPoint::calcValue”: 不能将参数 1 从“int (__thiscall CFuncPoint::* )(int,int)”转换为“int (__cdecl *)(int,int)”
error C2664: “CFuncPoint::calcValue”: 不能将参数 1 从“int (__thiscall CFuncPoint::* )(int,int)”转换为“int (__cdecl *)(int,int)”
问一下该怎么将类的成员函数当成函数指针传递给其它函数?
//FuncPoint.h
class CFuncPoint
{
public:
int max(int a, int b);
int min(int a, int b);
void calcValue(int (*p)(int, int), int a, int b);
};
//FuncPoint.cpp
//函数指针测试
#include “FuncPoint.h”
#include <iostream>
int CFuncPoint::max(int a, int b)
{
printf(“a = %d, b = %d, max: “, a, b);
return a > b ? a : b;
}
int CFuncPoint::min(int a, int b)
{
printf(“a = %d, b = %d, min: “, a, b);
return a < b ? a : b;
}
void CFuncPoint::calcValue(int (*p)(int, int), int a, int b)
{
int rtn = p(a, b);
printf(“%d\n”, rtn);
}
void main(int argc, void* args[])
{
CFuncPoint fp;
fp.calcValue(fp.max, 3, 4); // <–此处报错
fp.calcValue(fp.min, 2, 5); // <–此处报错
getchar();
}
解决方案
35
成员函数指针和普通的函数指针有很大的不同, 是不能将成员函数指针当做普通函数指针来传递的.
普通的函数指针就是一个指针的大小, 32 位下是 4 个字节, 64 位下是 8 个字节. 而成员函数指针在 32 位下就可能是 4 个字节, 8 个字节, 16 个字节等等.
要把成员函数和普通函数统一处理, 最好是使用 C++11 的 std::function 和 std::bind, 假如环境不支持 C++11 就用 boost 库里的这两个库.
普通的函数指针就是一个指针的大小, 32 位下是 4 个字节, 64 位下是 8 个字节. 而成员函数指针在 32 位下就可能是 4 个字节, 8 个字节, 16 个字节等等.
要把成员函数和普通函数统一处理, 最好是使用 C++11 的 std::function 和 std::bind, 假如环境不支持 C++11 就用 boost 库里的这两个库.
10
参考: http://www.adintr.com/mytranslate/fastdelegate.html
60
5
//FuncPoint.h class CFuncPoint { public: int max(int a, int b); int min(int a, int b); void calcValue(int (CFuncPoint::*p)(int, int), int a, int b); }; //FuncPoint.cpp //函数指针测试 #include <iostream> int CFuncPoint::max(int a, int b) { printf("a = %d, b = %d, max: ", a, b); return a > b ? a : b; } int CFuncPoint::min(int a, int b) { printf("a = %d, b = %d, min: ", a, b); return a < b ? a : b; } void CFuncPoint::calcValue(int (CFuncPoint::*p)(int, int), int a, int b) { int rtn = (this->*p)(a, b); printf("%d\n", rtn); } void main(int argc, void* args[]) { CFuncPoint fp; fp.calcValue(&CFuncPoint::max, 3, 4); // <--此处报错 fp.calcValue(&CFuncPoint::min, 2, 5); // <--此处报错 getchar(); }
20
void calcValue(int (CFuncPoint:: *p)(int, int), int a, int b);