搜索
bottom↓
回复: 15

c++函数参数是函数指针,怎么用另一个类里面的函数做为参数

[复制链接]

出0入0汤圆

发表于 2015-5-6 19:16:23 | 显示全部楼层 |阅读模式
本帖最后由 晨星 于 2015-5-6 19:25 编辑

如题 :c++函数的参数是函数指针,怎么用另一个类里面的函数做为参数
我的程序太长了不便贴出来,我写个大概的框架
class A
{
        void x1()
        {
        ;;
        }
};
class B
{
        void x2()
        {
        ;;
        }
};

typedef void (*P)();/*函数指针,*/

class C
{
A a;B b;
        void cx()
        {

        }
        void x3(P xx)
        {
                xx();
        }

        void x4()
        {
        x3(a.x1);//这样用提示错误,应该怎么办呢
        x3(b.x2);//这样用提示错误,应该怎么办呢
        x3(cx);  //这个可以用
        }
};


希望个位前辈指教

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入4汤圆

发表于 2015-5-6 19:47:55 | 显示全部楼层
没见过你这样的用法,
你这样用,就倒回了C语言的风格了。
实际中你这种要求是用多态实现的。
class C 做基类,class A与class B做class C的派生类;
x1,X2函数在class C中申明为虚函数,具体看下面的例子:

class C
{
public:
        virtual void x1(){}
        virtual void x2(){}
        void cx(){}
};

class A : public C
{
public:
        virtual void x1(){}
};

class B : public C
{
public:
        virtual void x2(){}
};

int main(void)
{
        A a;
        B b;
        C c;
        C *pc;

        pc = &a;
        pc->x1();
       
        pc = &b;
        pc->x2();
       
        pc = &c;
        pc->cx();
       
        return 0;
}

出0入37汤圆

发表于 2015-5-6 21:56:56 | 显示全部楼层
这个是c++的“类成员函数指针”,“类成员函数指针”不仅仅包含了函数的入口指针同时还包含对象指针,这个使用起来语法相当的丑陋,我建议你不要这么做,这个完全违背了c++的OO原则

出0入37汤圆

发表于 2015-5-6 22:02:58 | 显示全部楼层
在你这么使用之前你看看这个帖子:http://www.cppblog.com/colys/articles/25785.html
你理解下这个帖子的内容然后按照你的理解把测试程序写出来,估计大多数人都要很多次才能把这个“成员函数指针”的声明和使用方法弄正确

出0入8汤圆

发表于 2015-5-6 19:16:24 来自手机 | 显示全部楼层
简单做法,成员函数定义成静态的
复杂做法
你这里成员函数指针的类型分别是
void(A::*)(void)和void(B::*)(void)
这两个函数指针是不同类型的,你光靠一个P xx是不行的
要么用模板,要么重载
你要用的时候还得把类对象传进去 x3(&a,a.x1)
调用的时候看起来是这样
a->*xx();

出0入0汤圆

发表于 2015-5-6 23:36:18 | 显示全部楼层
还是先描述问题吧:什么情况下需要用到这种不常见的模式: “用另一个类里面的函数做为参数”,如果只是辅助类函数,可以把它们放到一个namespace里直接调用

出0入0汤圆

 楼主| 发表于 2015-5-7 09:06:05 | 显示全部楼层
本帖最后由 晨星 于 2015-5-7 09:07 编辑

谢谢你的回答,各位的回答都很受用

出0入0汤圆

 楼主| 发表于 2015-5-7 09:06:43 | 显示全部楼层
ibichao 发表于 2015-5-6 19:47
没见过你这样的用法,
你这样用,就倒回了C语言的风格了。
实际中你这种要求是用多态实现的。

谢谢你的回答,我吧莫元给了钱最少的,你的回答也很有帮助

出0入0汤圆

 楼主| 发表于 2015-5-7 09:08:00 | 显示全部楼层
varding 发表于 2015-5-6 22:02
在你这么使用之前你看看这个帖子:http://www.cppblog.com/colys/articles/25785.html
你理解下这个帖子的 ...

谢谢你的回答,我吧莫元给了钱最少的,你的回答也很有帮助

出0入0汤圆

 楼主| 发表于 2015-5-7 09:10:20 | 显示全部楼层
ywhbn 发表于 2015-5-6 23:36
还是先描述问题吧:什么情况下需要用到这种不常见的模式: “用另一个类里面的函数做为参数”,如果只是辅 ...

我是在单片机里面用的,为了实现分时调用函数,所以用到了函数指针可以更好的管理调用任务,单片机里面用c++的很少,所以就到这个版块提问了

出0入4汤圆

发表于 2015-5-7 09:17:16 | 显示全部楼层
晨星 发表于 2015-5-7 09:06
谢谢你的回答,我吧莫元给了钱最少的,你的回答也很有帮助

不要去弄一些C的方法加到C++上,没有意义;
用C++做程序,就要遵循C++的方法,否则你就改成C吧。

出0入0汤圆

 楼主| 发表于 2015-5-7 09:47:02 | 显示全部楼层
ibichao 发表于 2015-5-7 09:17
不要去弄一些C的方法加到C++上,没有意义;
用C++做程序,就要遵循C++的方法,否则你就改成C吧。 ...

恩,谢谢,一直都用的c,最近才用c++很多方面不懂

出0入0汤圆

发表于 2015-5-9 13:55:34 | 显示全部楼层
晨星 发表于 2015-5-7 09:10
我是在单片机里面用的,为了实现分时调用函数,所以用到了函数指针可以更好的管理调用任务,单片机里面用c++ ...

一种实现方法:
  • 定义一个基类:Task,包含若干方法,如run, stop
  • 从Task派生出具体的task,如DisplayTask,具体实现run, stop
  • 分时调用这些task的方法

出0入0汤圆

发表于 2015-5-9 14:10:37 | 显示全部楼层
标准的做法,请参照 stl 里的 std::bind

出0入0汤圆

 楼主| 发表于 2015-5-22 08:04:43 | 显示全部楼层
ywhbn 发表于 2015-5-9 13:55
一种实现方法:
  • 定义一个基类:Task,包含若干方法,如run, stop

  • 谢谢,那样是不是我每加一个函数都要在基类里面添加一个,这样移植也是很麻烦,还是谢谢你的建议,我会试试的

    出0入0汤圆

     楼主| 发表于 2015-5-22 08:05:04 | 显示全部楼层
    mangocity 发表于 2015-5-9 14:10
    标准的做法,请参照 stl 里的 std::bind

    谢谢你的建议
    回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

    GMT+8, 2024-10-3 02:12

    © Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

    快速回复 返回顶部 返回列表