zoukankan      html  css  js  c++  java
  • 实战经验:通过类成员函数指针实现类方法调用

    成员指针解引用操作符(.*)从对象或引用获取成员
    *成员指针箭头操作符(->*)通过对象的指针获取成员

    类成员函数指针定义

    因为函数是一个类的成员,所以它的指针定义有别于全局函数,格式如下:

    typedef 返回值(类名::*函数指针类型名称)(参数列表);

    需要注意的地方

    1) 使用typedef创建一个用户自定义类型,这个类型的名称即上述格式中的函数指针类型名称

    2) 在函数指针类型名称之前需要添加类名,并加上双引号(::)

    初始化方式

    假设我们的一个类有如下的成员函数:

    bool DriveCar(LPCTSTR pszCar);

    则对应的,我们定义了如下的类成员函数指针来描述此成员函数

    typedef bool (CPerson::*FP_DriveCar)(LPCTSTR pszCar);

    注意这里的类标记(CPerson::),以及类成员指针前的星号(*)。

    那么我们可以为该类定义函数指针类型的数据成员

    FP_DriveCar m_pfnDriveCar;

    这里的m_pfnDriveCar是一个数据成员,其类型为指向类成员的函数指针(FP_DriveCar)。

    则该数据成员初始化方法如下:

    m_pfnDriveCar = &CPerson::DriveCar;

    使用类名作为前缀,指明我们需要访问CPerson类的DriveCar方法。另外,加上取地址符号(&)取得其函数地址。

    调用方式

    1) 在类内部

    (this->*m_pfnDriveCar)(_T(“TestCar”));

    2) 在类外部

    CPerson person;

    FP_DriveCar g_pfnDriveCar = &CPerson::DriveCar;

    (person.*g_pfnDriveCar)(_T(“TestCar”));

    注意的地方

    1) 在类内部调用时,需要加上(this->)。

    2) 在类外部调用时,需要加上对象的实例,这里即(person.)。

    3) 函数指针前加上解除引号符号(*)。

    以下为完整的示例代码

     

    总结

    1) 类成员函数指针和普通全局函数指针的区别在于,需要特殊的语法(通常是加上类名)来进行定义和调用,这是因为类成员函数有一个隐藏的this参数。

    2) 如果需要在类外部使用类函数指针,则目标类成员函数必须设定为public访问类型。

    3) 调用时,需要显式的加上类实例(以上代码中的this->或者person.)。



    作者:漫漫开发路
    链接:https://www.jianshu.com/p/036f0c789db2
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    maven_Error building POM (may not be this project's POM)错误
    jmeter经验---java 追加写入代码一例
    java I/O Stream 代码学习总结
    java 布尔值一种赋值方法
    Spring cloud config 使用gitHub或者gitee连接
    linux/mac下一键删除下载失败的maven jar包
    MYSQL主从复制制作配置方案
    centos7 下解决mysql-server找不到安装包问题
    基于存储过程的百万级测试数据自动生成
    mysql慢查询,死锁解决方案
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/11394408.html
Copyright © 2011-2022 走看看