有没有办法把类的成员函数绑定到函数指针

flyrack 2014-01-22 02:58:37
如果是静态函数,那么函数内所有的外部变量都必须是静态的哎
有什么实现方法么

void (*Fun)();
class A{
A(){
Fun=B;//Ok
Fun=C;//err
}
static void B();
void C();
};

int main()
{
A a();
return 0;
}

...全文
942 33 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2014-01-25
  • 打赏
  • 举报
回复
搜到一个 云风的 BLOG ,里面好像,讲到这个问题 感觉这个问题 lua 的大牛,比较容易解决,毕竟这是两种语言交互的问题
lm_whales 2014-01-25
  • 打赏
  • 举报
回复
引用 17 楼 taodm 的回复:
你想太多了。多个人在同一帖子里提问,或者一帖子里提多个问题,都是让人无法专心回答的。
好吧,我是感觉二者,有类似之处。 不是另外提出一个问题,那个问题是哪个帖子,记不住了,所以把那个问题罗列出来。 另外,我已经说了,可以用函数对象,或者函数对象模板实现的。 没有让他,不使用C++ 26楼的函数对象,就不错。。。。
引用 26 楼 QQ575787460 的回复:
#include <iostream>

class test
{
public:
  void print()
  {
    std::cout << __func__ << std::endl;
  }
};

template <typename CLASS_TYPE, typename RETURN_TYPE>
class mem_fun_obj
{
public:
  mem_fun_obj(CLASS_TYPE *obj, RETURN_TYPE (CLASS_TYPE::*f)())
    : obj_(obj), f_(f)
  { }

  RETURN_TYPE operator()()
  {
    return (obj_->*f_)();
  }

private:
  CLASS_TYPE *obj_;
  RETURN_TYPE (CLASS_TYPE::*f_)();
};

int main()
{
  test t;
  mem_fun_obj<test, void> fun_obj(&t, &test::print);
  fun_obj();
  return 0;
}
或者这样,直接把实例也绑上去。
++
引用 28 楼 OExpress 的回复:
STL提供std::mem_fun和std::mem_fun_ref 解决方案
++ 28 楼的方式也可以的
盗墓笔 2014-01-23
  • 打赏
  • 举报
回复
引用 2 楼 mujiok2003 的回复:
呵呵,这个代码
//A a();
A a;
哈哈,程序找错题。
coderchenjingui 2014-01-23
  • 打赏
  • 举报
回复
#include <iostream>

class test
{
public:
  void print()
  {
    std::cout << __func__ << std::endl;
  }
};

template <typename CLASS_TYPE, typename RETURN_TYPE>
class mem_fun_obj
{
public:
  mem_fun_obj(CLASS_TYPE *obj, RETURN_TYPE (CLASS_TYPE::*f)())
    : obj_(obj), f_(f)
  { }

  RETURN_TYPE operator()()
  {
    return (obj_->*f_)();
  }

private:
  CLASS_TYPE *obj_;
  RETURN_TYPE (CLASS_TYPE::*f_)();
};

int main()
{
  test t;
  mem_fun_obj<test, void> fun_obj(&t, &test::print);
  fun_obj();
  return 0;
}
或者这样,直接把实例也绑上去。
coderchenjingui 2014-01-23
  • 打赏
  • 举报
回复
#include <iostream>

class test
{
public:
  void print()
  {
    std::cout << __func__ << std::endl;
  }
};

template <typename CLASS_TYPE, typename RETURN_TYPE>
class mem_fun_obj
{
public:
  mem_fun_obj(RETURN_TYPE (CLASS_TYPE::*f)()) :f_(f) { }

  RETURN_TYPE operator()(CLASS_TYPE &obj)
  {
    return (obj.*f_)();
  }

private:
  RETURN_TYPE (CLASS_TYPE::*f_)();
};

int main()
{
  mem_fun_obj<test, void> fun_obj(&test::print);
  test t;
  fun_obj(t);
  return 0;
}
楼主看这样行不
coderchenjingui 2014-01-23
  • 打赏
  • 举报
回复
可以参考下std::mem_fun和std::mem_fun_ref
flyrack 2014-01-23
  • 打赏
  • 举报
回复
其实我遇到的问题是lua中userdata传值的问题 要求的指针函数是int (*F)(lua_State* L) 没有其他选择,我希望能写个模板实现注册lua的userdata static int D[]={1,2,3,4,5}; lua_data<int> Data; Data.Fun_Setup(l,"Foo",D,5,0); 注册是没有任何压力的,就是赋初始值的问题 赋值函数 template <class T> int lua_data<T>::Fun_new(lua_State* L) { show("## new\n"); T** parray = (T**)lua_newuserdata(L, sizeof(T*)); *parray = Point; luaL_getmetatable(L, Name); lua_setmetatable(L, -2); return 1; } 就是那个*parray = Point;没法动态赋值
HaoYuan 2014-01-23
  • 打赏
  • 举报
回复
引用 24 楼 QQ575787460 的回复:
可以参考下std::mem_fun和std::mem_fun_ref
引用 28 楼 OExpress 的回复:
STL提供std::mem_fun和std::mem_fun_ref 解决方案
正解
Luisfan 2014-01-23
  • 打赏
  • 举报
回复
我以前写的: class CG3GroupData; typedef bool(CG3GroupData::*G3GroupFunc)(INT iIFID,PDZ_3G_Message pData); class CG3GroupData { public: bool UserLogin(INT iIFID,PDZ_3G_Message pData); //用户登录 } 用上面的指针,就可以指向成员函数了
CyberLogix 2014-01-23
  • 打赏
  • 举报
回复
STL提供std::mem_fun和std::mem_fun_ref 解决方案
assembly 2014-01-22
  • 打赏
  • 举报
回复
不是类型不匹配,是编译器禁止这样干。
derekrose 2014-01-22
  • 打赏
  • 举报
回复
为什么会报错?我猜应该是类型不匹配吧
flyrack 2014-01-22
  • 打赏
  • 举报
回复
我是在使用lua发现这个问题的 仔细想了下 因为脚本比程序后执行 提前赋值似乎不太现实
assembly 2014-01-22
  • 打赏
  • 举报
回复
各位大神请息怒。。。 在下也关注这个问题。 Fun=C;//err 当时也不理解为什么这样的方式会ERROR,现在想来,也许是参数传递的问题,C++内部实现的时候,不同编译器对象指针的传递可能没有统一的规范,这也相当于把C++的某些不清爽的东西暴露出来,不好协调,不好弄。 9楼的方法是显示地传递了指针,形式上稍有点绕,但在某些情况下,是非常强有力的方法。
taodm 2014-01-22
  • 打赏
  • 举报
回复
如果你真要这么想下去,那就只能想到你自己的人品问题了,你干扰了楼主寻找他要的答案了。
引用 18 楼 lm_whales 的回复:
[quote=引用 14 楼 taodm 的回复:] 不同级别的人需要的答案是不同的。 楼主需要的答案是:别瞎折腾。 如果你需要答案,就完全不一样了。
我记得,我们没有个人恩怨的呀,所以对你的人品,我是不会无端怀疑的。 不知道你从那里,看到,我需要答案。 难道因为,你层次太高,是我等蝼蚁需要仰视的存在, 所以我等就需要您不屑一顾的答案了? 我相信,每个愿意回答问题的,都是真心的,所以看到你,认为你的人品是没有问题的。 所以只能从层次上找原因了。 [/quote]
lm_whales 2014-01-22
  • 打赏
  • 举报
回复
引用 14 楼 taodm 的回复:
不同级别的人需要的答案是不同的。 楼主需要的答案是:别瞎折腾。 如果你需要答案,就完全不一样了。
我记得,我们没有个人恩怨的呀,所以对你的人品,我是不会无端怀疑的。 不知道你从那里,看到,我需要答案。 难道因为,你层次太高,是我等蝼蚁需要仰视的存在, 所以我等就需要您不屑一顾的答案了? 我相信,每个愿意回答问题的,都是真心的,所以看到你,认为你的人品是没有问题的。 所以只能从层次上找原因了。
taodm 2014-01-22
  • 打赏
  • 举报
回复
你想太多了。多个人在同一帖子里提问,或者一帖子里提多个问题,都是让人无法专心回答的。
引用 15 楼 lm_whales 的回复:
[quote=引用 14 楼 taodm 的回复:] 不同级别的人需要的答案是不同的。 楼主需要的答案是:别瞎折腾。 如果你需要答案,就完全不一样了。 [quote=引用 12 楼 lm_whales 的回复:] [quote=引用 11 楼 taodm 的回复:] 楼主是lm_whales 的马甲?
抱歉,暂时没考虑马甲。。。 你这大神级别的,还怕马甲[/quote][/quote]
引用 14 楼 taodm 的回复:
不同级别的人需要的答案是不同的。 楼主需要的答案是:别瞎折腾。 如果你需要答案,就完全不一样了。 [quote=引用 12 楼 lm_whales 的回复:] [quote=引用 11 楼 taodm 的回复:] 楼主是lm_whales 的马甲?
抱歉,暂时没考虑马甲。。。 你这大神级别的,还怕马甲[/quote][/quote]
引用 14 楼 taodm 的回复:
不同级别的人需要的答案是不同的。 楼主需要的答案是:别瞎折腾。 如果你需要答案,就完全不一样了。 [quote=引用 12 楼 lm_whales 的回复:] [quote=引用 11 楼 taodm 的回复:] 楼主是lm_whales 的马甲?
抱歉,暂时没考虑马甲。。。 你这大神级别的,还怕马甲[/quote][/quote] 你的意思是让楼主,放弃这个已经做好的使用函数指针的库,或者现成的代码 用C++STL提供的现成工具, 或者用C++ 重做这个库,别用这个函数指针? 我不需要这个答案,只是以前遇到一个类似的问题 不过是纯粹的C 那个问题时这样的 对一个双变量函数(这个函数在定义域内连续),求他的对某个变量的定积分(此时另一个变量为定值)。 要求对另一个变量的任何值(定义域内的),都可以求出这个定积分。 用C++自然没有问题,可以有很多很好的方法。 单独用C解决,就和这个问题类似,所以告诉他这样一个方法。 你否是认为,这种问题是在浪费生命。。。。。。。。。 还是这种问题太简单,您不屑一顾。。。。。。。。 什么时候用了马甲,一定告诉您。。。。。。。。。 不需要推测,这个没必要! 我需要这个答案,也不会自己提出问题,自己回答。 另外,以后在遇到类似,您不屑一顾的问题,一定要通知我。 多谢提携! [/quote]
lm_whales 2014-01-22
  • 打赏
  • 举报
回复
引用 14 楼 taodm 的回复:
不同级别的人需要的答案是不同的。 楼主需要的答案是:别瞎折腾。 如果你需要答案,就完全不一样了。
那个问题,大概是这个样子的: 对一个双变量函数(这个函数在定义域内连续),求他对某个变量的定积分(此时另一个变量为定值)。 要求,对另一个变量的任何值(定义域内的),都可以求出这个定积分。 是定积分的数值解法。 这个求定积分的函数,要求传入函数指针, 该函数指针,指向一个参数(变量)的函数 这个求定积分的函数,可能是已经定义好的。 不需要自己做一个。 需要定义的是双变量求值的函数(这是个数学函数有公式的), 要求定义一个函数,来表示双变量求值的函数 只能传入一个参数; 因为求定积分的函数,只能接受那样的函数指针。
lm_whales 2014-01-22
  • 打赏
  • 举报
回复
引用 14 楼 taodm 的回复:
不同级别的人需要的答案是不同的。 楼主需要的答案是:别瞎折腾。 如果你需要答案,就完全不一样了。 [quote=引用 12 楼 lm_whales 的回复:] [quote=引用 11 楼 taodm 的回复:] 楼主是lm_whales 的马甲?
抱歉,暂时没考虑马甲。。。 你这大神级别的,还怕马甲[/quote][/quote]
引用 14 楼 taodm 的回复:
不同级别的人需要的答案是不同的。 楼主需要的答案是:别瞎折腾。 如果你需要答案,就完全不一样了。 [quote=引用 12 楼 lm_whales 的回复:] [quote=引用 11 楼 taodm 的回复:] 楼主是lm_whales 的马甲?
抱歉,暂时没考虑马甲。。。 你这大神级别的,还怕马甲[/quote][/quote]
引用 14 楼 taodm 的回复:
不同级别的人需要的答案是不同的。 楼主需要的答案是:别瞎折腾。 如果你需要答案,就完全不一样了。 [quote=引用 12 楼 lm_whales 的回复:] [quote=引用 11 楼 taodm 的回复:] 楼主是lm_whales 的马甲?
抱歉,暂时没考虑马甲。。。 你这大神级别的,还怕马甲[/quote][/quote] 你的意思是让楼主,放弃这个已经做好的使用函数指针的库,或者现成的代码 用C++STL提供的现成工具, 或者用C++ 重做这个库,别用这个函数指针? 我不需要这个答案,只是以前遇到一个类似的问题 不过是纯粹的C 那个问题时这样的 对一个双变量函数(这个函数在定义域内连续),求他的对某个变量的定积分(此时另一个变量为定值)。 要求对另一个变量的任何值(定义域内的),都可以求出这个定积分。 用C++自然没有问题,可以有很多很好的方法。 单独用C解决,就和这个问题类似,所以告诉他这样一个方法。 你否是认为,这种问题是在浪费生命。。。。。。。。。 还是这种问题太简单,您不屑一顾。。。。。。。。 什么时候用了马甲,一定告诉您。。。。。。。。。 不需要推测,这个没必要! 我需要这个答案,也不会自己提出问题,自己回答。 另外,以后在遇到类似,您不屑一顾的问题,一定要通知我。 多谢提携!
taodm 2014-01-22
  • 打赏
  • 举报
回复
不同级别的人需要的答案是不同的。 楼主需要的答案是:别瞎折腾。 如果你需要答案,就完全不一样了。
引用 12 楼 lm_whales 的回复:
[quote=引用 11 楼 taodm 的回复:] 楼主是lm_whales 的马甲?
抱歉,暂时没考虑马甲。。。 你这大神级别的,还怕马甲[/quote]
加载更多回复(13)

65,180

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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