专栏首页架构说每日一问:c++类的成员函数,能作为线程的参数吗?

每日一问:c++类的成员函数,能作为线程的参数吗?

问:类的成员函数可以传入线程参数吗?

回答:

如果c语言的全局函数,可以。

如果是类的静态成员函数,可以

如果是类的普通成员函数,不可以

为什么?

《深入探索C++对象模型》中提到成员函数时,当成员函数不是静态的,虚函数,那么我们有以下结论: 
 (1) &类名::函数名 获取的是成员函数的实际地址;

 (2) 对于函数x来讲obj.x()编译器转化后表现为x(&obj),&obj作为this指针传入; 
 (3) 无法通过强制类型转换在类成员函数指针与其外形几乎一样的普通函数指针之间进行有效的转换。

所以,要在回调函数中传入一个类的普通成员函数时,this指针无处安放使得回调函数比较复杂。

怎么解决?

对成员函数进行强制转换,当作回调函数

class MyClass  
{  
    pthread_t TID;  
    void func()  
{  
        //子线程执行代码  
    }  
public:  
    bool startThread()  
{//启动子线程  
        typedef void* (*FUNC)(void*);//定义FUNC类型是一个指向函数的指针,该函数参数为void*,返回值为void*  
        FUNC callback = (FUNC)&MyClass::func;//强制转换func()的类型  
        int ret = pthread_create( &TID , NULL , callback , this );  
        if( ret != 0 )  
            return false;  
        else  
            return true;  
    }  
};  
  
int main()  
{  
    MyClass a;  
    a.startThread();  
}

回调函数为普通函数,但在函数体内执行成员函数

本文分享自微信公众号 - 架构说(JiaGouS),作者:王传义

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • c 语言基础知识之一

    Q1 : 今天看redis代码 普通的函数都添加static 修改 static int aeApiCreate(aeEventLoop *eventLoop...

    程序员小王
  • c++在编译中遇到符合不存在如何解决?

    今日问题:symbol 不存在 : symbol lookup error: ./libinterface.so: undefined symbol: _ZN...

    程序员小王
  • c++系列之二 指向成员函数的指针(烧脑)

    这是一篇翻译的文章,原文详细解释了C++中指向成员函数的指针,因为带有“教程”一词,所以比较通俗易懂。为了使文章读起来通俗有趣,翻译君并未一字一句一板一眼地翻译...

    程序员小王
  • 深入解构iOS系统下的全局对象和初始化函数

    事件源于接入了一个第三方库导致应用出现了大量的crash记录,很奇怪的是这么多的crash居然没有收到用户的反馈信息! 在这个过程中每个崩溃栈的信息都明确的指向...

    欧阳大哥2013
  • 深入理解 JavaScript 回调函数 [每日前端夜话0xDF]

    JavaScript 回调函数是成为一名成功的 JavaScript 开发人员必须要了解的一个重要概念。但是我相信,在阅读本文之后,你将能够克服以前使用回调方法...

    疯狂的技术宅
  • 窥探Swift之函数与闭包的应用实例

    今天的博客算是比较基础的,还是那句话,基础这东西在什么时候都是最重要的。说到函数,只要是写过程序就肯定知道函数是怎么回事,今天就来讨论一下Swift中的函数的特...

    lizelu
  • 神经网络如何完成表征?

    我们了解神经网络以及它们从数据科学到计算机视觉的多个领域中的无数成就。众所周知,它们在解决有关泛化性方面的复杂任务中表现良好。从数学上讲,他们非常擅长近似任何的...

    AI研习社
  • 深入剖析!神经网络内部是如何完成表征的

    博客原标题:Representation Power of Neural Networks

    崔庆才
  • 5.2Python函数(二)

    py3study
  • C++的多态总结(静态&动态)

    我们以前说过的函数重载就是一个简单的静态多态,静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数可以调用就调,没有的话...

    WindSun

扫码关注云+社区

领取腾讯云代金券