一、引言

当我们在 C++ 中直接像 C 那样使用类的成员函数指针时,通常会报错,提示你不能使用非静态的函数指针:

reference to non-static member function must be called

两个解决方法:

  1. 把非静态的成员方法改成静态的成员方法
  2. 正确的使用类成员函数指针(在下面介绍)

关于函数指针的定义和使用你还不清楚的话,可以先看这篇博客了解一下:

https://blog.csdn.net/afei__/article/details/80549202

二、语法

1. 非静态的成员方法函数指针语法(同C语言差不多):

void (*ptrStaticFun)() = &ClassName::staticFun;

2. 成员方法函数指针语法:

void (ClassName::*ptrNonStaticFun)() = &ClassName::nonStaticFun;

注意调用类中非静态成员函数的时候,使用的是 类名::函数名,而不是 实例名::函数名

三、实例:

#include <stdio.h>
#include <iostream>using namespace std;class MyClass {
public:static int FunA(int a, int b) {cout << "call FunA" << endl;return a + b;}void FunB() {cout << "call FunB" << endl;}void FunC() {cout << "call FunC" << endl;}int pFun1(int (*p)(int, int), int a, int b) {return (*p)(a, b);}void pFun2(void (MyClass::*nonstatic)()) {(this->*nonstatic)();}
};int main() {MyClass* obj = new MyClass;// 静态函数指针的使用int (*pFunA)(int, int) = &MyClass::FunA;cout << pFunA(1, 2) << endl;// 成员函数指针的使用void (MyClass::*pFunB)() = &MyClass::FunB;(obj->*pFunB)();// 通过 pFun1 只能调用静态方法obj->pFun1(&MyClass::FunA, 1, 2);// 通过 pFun2 就是调用成员方法obj->pFun2(&MyClass::FunB);obj->pFun2(&MyClass::FunC);delete obj;return 0;
}

C++ 类成员函数的函数指针相关推荐

  1. C++:运算符重载与类的赋值运算符重载函数

    目录 章节知识架构 一.运算符重载 1. 运算符重载的基本概念 代码段1 2.关于运算符重载的重要语法细则 二.运算符重载在类中的使用 三.类的默认成员函数:=重载函数(赋值运算符重载) 1.自定义= ...

  2. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

  3. 类成员函数指针的语法

    /*类成员函数指针的语法*/ /*****************************类.h文件************************************/ #if !defined ...

  4. C++中空指针调用类成员函数的原理

    有下面的一个简单的类: class CNullPointCall { public:     static void Test1();     void Test2();     void Test3 ...

  5. 类的概念、成员函数的定义方式、类的访问控制和封装、类的大小、this指针

    文章目录 类的概念 struct class class和struct的区别是什么呢? 类中成员函数的两种定义方式 声明和定义都在类中 声明和定义分离 类的访问控制和封装 类的封装特性 类的大小 结构 ...

  6. C++函数指针和类成员函数指针

    一.函数指针--基本形式 char Fun(int n) { return char(n); } //char(*pFun)(int);void main() {char(*pFun)(int);pF ...

  7. 一文带你入门C++,类与对象、6个默认成员函数、this指针以及static关键字。

    C++98关键字:63个 一.命名空间规则(namespace) 1.命名空间可以解决函数.全局变量名重复的问题,包在不同的命名空间里的重复函数,实际就是两个完全无关的函数. 2.命名空间允许续嵌套: ...

  8. 指向 类成员函数 指针的用法

    C++在使用函数指针调用类成员函数的时候会遇到很多问题,以下是解决办法: 代码 //test.h class CMyc{ public:int fun(int);typedef int (CMyc:: ...

  9. 函数指针以及在类成员函数中应用函数指针

    什么是函数指针 如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址.而且函数名表示的就是这个地址.既然是地址我们就可以定义一个指针变 ...

  10. C++ 函数指针 类成员函数指针

    一.函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址. 1.函数 ...

最新文章

  1. 得了诺奖的彩色照相术失传100多年,现在终于被找回来了
  2. Python高级教程-生成器
  3. Windows7自动安装驱动功能关闭与开启教程
  4. Spring框架—体系结构
  5. 【小程序】刘一哥课堂随机点名提问神器V1.0(附源程序)
  6. linux网络编程之一般应用采用的协议和不同套接字的地址结构以及用户进程和内核通过哪些函数传递套接字的地址结构
  7. NLP文本相似度 - LCS(最长公共子序列)java代码
  8. 主机路由在计算机中的应用
  9. .net学习---ADO
  10. 手把手!基于领域预训练和对比学习SimCSE的语义检索(附源码)
  11. Python 爬取 42 年高考数据,告诉你高考为什么这么难?
  12. 软件测试从业 3 年+了,怎么兼顾 管理 与 自身成长?
  13. 事记:关于远控软件导致win10屏幕亮度无法调节的解决方案
  14. Ubuntu18搭建SVN可视化工具if.svnadmin
  15. 快速掌握阿里云 OSS
  16. DataMatrix识别及定位项目笔记(2)——基于QT+libdmtx-0.7.5的DataMatrix解码及定位
  17. java中jsp是什么_JSP是什么?
  18. ad软件one pin错误是啥意思_AD错误中英文对照
  19. MATLAB中强行终止执行程序的4种方法
  20. [摘]四十二天学会英语的模范短文和经典100句

热门文章

  1. 截止失真放大电路_BJT的失真
  2. Finance reading list(Mar.2019,by Stephen Nie)
  3. 基于深度学习的色情视频鉴定
  4. dws中间表模型设计: 页面受访明细宽表
  5. oracle的alter table,Oracle ALTER TABLE语句
  6. 如何下载历史版本和最新版本的iar
  7. seo优化之怎样降低网站跳出率
  8. SpringBoot+H5微信登陆(网页)
  9. 极品PS动作繁星散射GIF动画
  10. 松弛型内存模型(Relaxed memory models)的一个有趣的例子