问一个基础的问题。关于函数指针

Yun__ 2012-11-26 07:06:58
有一个函数,他的功能是把另外一个函数指针放入数组中
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);
}
这样的有办法么? 我写出来报错。。
...全文
225 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gfm688 2012-11-27
  • 打赏
  • 举报
回复
只能用静态成员函数了,除非你会用Thunk插入this指针

typedef int(* ADDPROC)(int, int);
 
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;
}
yaozhiyong110 2012-11-27
  • 打赏
  • 举报
回复
类的成员函数是有this的 也就是说CLASS::max的并不是void(*p)(int,int)这个类型
Yun__ 2012-11-27
  • 打赏
  • 举报
回复
引用 2 楼 gfm688 的回复:
C/C++ code?123456789101112131415161718192021222324252627282930313233343536373839typedef int(* ADDPROC)(int, int); template <class ToType, class FromType>ToType union_cast (FromType f){ ……
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); 然后就报错了
lgstudyvc 2012-11-27
  • 打赏
  • 举报
回复
按照3#楼的用 回调
傻X 2012-11-27
  • 打赏
  • 举报
回复
引用 2 楼 gfm688 的回复:
C/C++ code? typedef int(* ADDPROC)(int, int); template <class ToType, class FromType> ToType union_cast (FromType f) {……
几个重点: 1.函数指针类型声明:typedef int(* XXX)(int, int); 2.如果使用这种ADD(&max)函数指针写法,max必须是静态和事先声明,不支持动态创建。
vcmfcjavabbs 2012-11-27
  • 打赏
  • 举报
回复
楼主是要把void WinProc(HWND, UINT, WPARAM, LPARAM)这样一个函数指针传递给ModuleAddWin,由ModuleAddWin来调用WinProc吗? 如果是这样,你的代码中的YWin::WinProc应该可以声明为静态成员函数。 修改ModuleAddWin函数: bool ModuleAddWin(YWin * rwin) { HWND hwnd = YWin->m_hWnd; //不知道你的YWin是一个窗口,还是一个别的什么类。但总是可以得到HWND句柄吧。 ADDPROC t = (&YWin::WinProc); t(NULL,NULL,NULL,NULL); }
Yun__ 2012-11-27
  • 打赏
  • 举报
回复
引用 7 楼 gfm688 的回复:
只能用静态成员函数了,除非你会用Thunk插入this指针 C/C++ code?1234567891011121314151617181920212223242526272829typedef int(* ADDPROC)(int, int); int ADD(ADDPROC p){ return p(1,2);} int Max(int a, int b){ ……
因为是需要方便扩展并且优化效率才会使用这样的方法,不然用类指针加函数指针就好了.. 既然这样的话. 就算了.吧 感谢各位了
gfm688 2012-11-26
  • 打赏
  • 举报
回复

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;
}
rxguoblp 2012-11-26
  • 打赏
  • 举报
回复
什么位置报错?

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧