有一个函数,他的功能是把另外一个函数指针放入数组中
int ADD(void(*p)(int,int) proc)
{
return p(1,2);
}
其中需要放入的函数为
int max(int a, int b)
{
return a+b;
}这个函数可能是在类中间 可能是不在类中
比如
int CLASS::max(int a, int b)
{
return a+b;
}
//主函数
int main()
{
ADD(&max);
CLASS *a =new CLASS;
ADD(&a->max);
}
这样的有办法么? 我写出来报错。。
int ADD(void(*p)(int,int) proc)
{
return p(1,2);
}
其中需要放入的函数为
int max(int a, int b)
{
return a+b;
}这个函数可能是在类中间 可能是不在类中
比如
int CLASS::max(int a, int b)
{
return a+b;
}
//主函数
int main()
{
ADD(&max);
CLASS *a =new CLASS;
ADD(&a->max);
}
这样的有办法么? 我写出来报错。。
typedef int(* ADDPROC)(int, int);template <class ToType, class FromType>
ToType union_cast (FromType f)
{
union { FromType _f; ToType _t; } ut;
ut._f = f;
return ut._t;
}int ADD(ADDPROC p)
{
return p(1,2);
}int Max(int a, int b)
{
return a+b;
}class CLASS
{
public:
int Max(int a, int b);
};int CLASS::Max(int a, int b)
{
return a+b;
}//主函数
int main()
{
ADD(&Max);
ADD(union_cast<ADDPROC>(&CLASS::Max));
return 0;
}
几个重点:
1.函数指针类型声明:typedef int(* XXX)(int, int);
2.如果使用这种ADD(&max)函数指针写法,max必须是静态和事先声明,不支持动态创建。
2#楼的方法确实可以加入了.. 只是调用就会出现
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.只是一加入就会出现这样的情况.申明
typedef void(* ADDPROC)(HWND, UINT,WPARAM,LPARAM);
template <class ToType, class FromType>
ToType union_cast (FromType f)
{
union { FromType _f; ToType _t; } ut;
ut._f = f;
return ut._t;
}
调用时
bool ModuleAddWin(YWin * rwin)
{
ADDPROC t =union_cast <ADDPROC>(&YWin::WinProc );
t(NULL,NULL,NULL,NULL);
}
调用时
YWin * win =new YWin ();
ModuleAddWin (win);
然后就报错了
int ADD(ADDPROC p)
{
return p(1,2);
}
int Max(int a, int b)
{
return a+b;
}
class CLASS
{
public:
static int Max(int a, int b)
{
return a+b;
}
};
//主函数
int main()
{
ADD(&Max);
ADD((ADDPROC)&CLASS::Max);
return 0;
}
如果是这样,你的代码中的YWin::WinProc应该可以声明为静态成员函数。
修改ModuleAddWin函数:
bool ModuleAddWin(YWin * rwin)
{
HWND hwnd = YWin->m_hWnd; //不知道你的YWin是一个窗口,还是一个别的什么类。但总是可以得到HWND句柄吧。
ADDPROC t = (&YWin::WinProc);
t(NULL,NULL,NULL,NULL);
}