- 主题:C++的成员函数如何做函数指针
如题
普通的函数,可以注册到另外一个函数指针上面
但是成员函数似乎不行,即
reg_func = &(myclass->mbr_foo);
这个编不过
正确的做法应该是怎样的,怎样把成员函数注册给另外一个函数指针?
谢谢
--
FROM 124.126.140.*
class Test
{
public:
int add(int a, int b) {return a+b;}
};
int (Test::* add_func)(int, int) = &Test::add;
【 在 lobachevsky 的大作中提到: 】
: 如题
: 普通的函数,可以注册到另外一个函数指针上面
: 但是成员函数似乎不行,即
: ...................
--
FROM 171.88.31.*
lambda封一层
capture this, 函数参数抄一遍
你就能更理解this指针,更理解lambda
【 在 lobachevsky 的大作中提到: 】
: 如题
: 普通的函数,可以注册到另外一个函数指针上面
: 但是成员函数似乎不行,即
: ...................
--
FROM 61.185.194.*
我试了一下,简化成了下面的样子(当然比你的例子复杂一点).
本质上,我需要在gfunc(实际上在另外一个文件里面)里面去调用执行myclass里面的函数指针.所以写得有点啰嗦:
#include <iostream>
using namespace std;
typedef struct {
int (*add)(int a, int b);
} GFUNC_T;
GFUNC_T gfun;
class Test
{
public:
Test();
public:
int add(int a, int b);
int (*padd_func)(int a, int b);
};
int (Test::* padd_func)(int, int) = &Test::add;
Test::Test()
{
// register function pointer to gfun
gfun.add = padd_func;
//gfun.add = &this->add;
}
int Test::add(int a, int b)
{
return a+b;
}
int main()
{
Test mytest;
cout << mytest.add(23, 44) << endl;
if (gfun.add != NULL)
{
cout << gfun.add(10,20);
}
return 0;
}
如上,在构造函数里面去注册函数
如果是 //gfun.add = &this->add;编译就会报member function不能做函数指针的错.
但是,改成 gfun.add = padd_func;之后,似乎是没有注册上.我实在想不到为神马了.
或许哪里犯了一个很低级的错误.
麻烦看一下哪里的问题.
【 在 dormouseBHU 的大作中提到: 】
: class Test
: {
: public:
: ...................
--
FROM 1.202.141.*
因为类成员函数指针只能写成 &类::函数, 不能写成 &对象->函数
调用类成员函数指针时要写成 (对象->*指针)(参数),例如:
MyClass * obj = new MyClass(...);
int(MyClass::*p)(int,int) = &MyClass::function; // not &obj->function
(obj->*p)(1,2); // obj->function(1,2)
反正语法挺诡异的,每次要用到类成员函数指针时我都得网上搜一搜才能回忆起来。
【 在 lobachevsky 的大作中提到: 】
: 我试了一下,简化成了下面的样子(当然比你的例子复杂一点).
: 本质上,我需要在gfunc(实际上在另外一个文件里面)里面去调用执行myclass里面的函数指针.所以写得有点啰嗦:
: #include <iostream>
: ...................
--
FROM 58.33.81.*
C++的成员函数是整个类共有的,所以成员函数指针也是针对整个类的,所以初始化定义时指向整个的类的。类似 int (CLASS::*fp)(PARA) = &CLASS::FUNC。调用时需要指明具体实例化的对象,比如CLASS c; c.*fp(para)。
换句话说,从来没有某个类实例的函数地址,也获取不到。你只能通过类实例去调用这个函数指针。
所以你看,类成员函数指针就是鸡肋,没啥额外好处。
【 在 lobachevsky 的大作中提到: 】
: 我试了一下,简化成了下面的样子(当然比你的例子复杂一点).
: 本质上,我需要在gfunc(实际上在另外一个文件里面)里面去调用执行myclass里面的函数指针.所以写得有点啰嗦:
: #include <iostream>
: ...................
--
FROM 223.167.168.*
这个事情搞得我很纠结
在我的代码里面,界面有一个类GuiClass,然后又有另外一些不太相关代码Sth.c,Sth里面的sth_op执行的时候,在Gui上面有显示。所以我第一反应是sth_op里面注册一个GuiClass->ShowOp。即
sth_op()
{
// real operation here
// gui show callback
if (gui_cb != NULL)
{
gui_cb;
}
}
然后在GuiClass的构造函数里面去注册这个gui_cb.
GuiClass::GuiClass()
{
// register gui_cb
gui_cb = this->ShowOp;
}
但是很显然,问题就出在gui_cb = this->ShowOp里面。
那么,什么样的做法是一个好的做法?
【 在 KillnCov 的大作中提到: 】
: C++的成员函数是整个类共有的,所以成员函数指针也是针对整个类的,所以初始化定义时指向整个的类的。类似 int (CLASS::*fp)(PARA) = &CLASS::FUNC。调用时需要指明具体实例化的对象,比如CLASS c; c.*fp(para)。
: 换句话说,从来没有某个类实例的函数地址,也获取不到。你只能通过类实例去调用这个函数指针。
: 所以你看,类成员函数指针就是鸡肋,没啥额外好处。
: ...................
--
FROM 124.126.140.*
我需要消化消化
感觉极其晦涩啊
【 在 RunningOn 的大作中提到: 】
: 因为类成员函数指针只能写成 &类::函数, 不能写成 &对象->函数
: 调用类成员函数指针时要写成 (对象->*指针)(参数),例如:
: MyClass * obj = new MyClass(...);
: ...................
--
FROM 124.126.140.*
你需要的不是一个指向类成员函数的指针。你需要一个指向对象的指针。所有对象有个公共的虚基类,也就是所谓的interface。
【 在 lobachevsky 的大作中提到: 】
: 这个事情搞得我很纠结
: 在我的代码里面,界面有一个类GuiClass,然后又有另外一些不太相关代码Sth.c,Sth里面的sth_op执行的时候,在Gui上面有显示。所以我第一反应是sth_op里面注册一个GuiClass->ShowOp。即
: sth_op()
: ...................
--
FROM 222.212.201.*
不知道你用的什么界面框架。
但是不管什么框架,把进度显示在界面上都是常见的功能,没有这么麻烦。
如果guiclass是controller,直接拿到这个contoller调用show即可,何必回调?
【 在 lobachevsky 的大作中提到: 】
: 这个事情搞得我很纠结
:
: 在我的代码里面,界面有一个类GuiClass,然后又有另外一些不太相关代码Sth.c,Sth里面的sth_op执行的时候,在Gui上面有显示。所以我第一反应是sth_op里面注册一个GuiClass->ShowOp。即
: ...................
--来自微微水木3.5.12
--
FROM 223.167.168.*