c++中的类成员函数指针
c++中的类成员函数指针
发生的事情
最近,想用一个QMap来创建字符串和一个函数的键值对,要用某个函数的时候,只需要根据键来获取值然后再调用就好了。也就不许要那么多的if或者switch了。
但是当我定义这个QMap时,我犯了难,我一下子不知道怎么定义,因为我是要把成员函数给放到这个QMap里面.
正常的函数指针定义
void func()
{
qDebug() << "123";
}
typedef void (*funType) ();
funType fun = func;
fun();
像上面这样,就定义了一个返回值为void,且没有参数的函数指针,并且通过指针调用了函数.但是类的成员函数又是另外一种使用方法,
定义类的成员函数指针
定义的方法:
Class A
{
public:
A();
private:
void func();
void func2();
private:
typedef void (A::*funType) (); //这里定义了类A的成员函数中返回值为void,没有参数的函数指针
QMap<QString, funType> m_funMap;
}
这上面就定义了一个QMap,根据前面的QString就可以调用对应的函数.
然后我又在调用方法上犯了难,在网上搜索之后,得到如下调用方式:
/*我先是插入了对应的键值对*/
/*
m_funMap.insert("func", A::func);
m_funMap.insert("func2", A::func2);
*/
(this->*m_funMap.value("func"))();
因为c++的成员函数的地址都是一样的,也就是说,一个类的成员函数就只有一个地址,而不是跟随实例.那么怎么区分这些实例调用的函数呢,这就需要用到this指针了,
所以,需要加上一个this来调用.
std::function
我在网上搜索的时候,发现了std::function这个东东,本着学习的心态我看了一下.
关于这个,API Reference Document std::function的解释是:
类模板 std::function 是通用多态函数封装器。 std::function 的实例能存储、复制及调用任何可调用 (Callable) 目标——函数、 lambda 表达式、 bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。
存储的可调用对象被称为 std::function 的目标。若 std::function 不含目标,则称它为空。调用空 std::function 的目标导致抛出 std::bad_function_call 异常。
用这种方法的存储函数指针的方式是:
Class A
{
public:
A();
private:
void func();
void func2(int a);
private:
typedef void (A::*funType) (); //这里定义了类A的成员函数中返回值为void,没有参数的函数指针
QMap<QString, funType> m_funMap;
}
std::function<void (A::*)()> function = std::bind(A::func, this);
funtion();
// 带参数的指针如下
std::function<void (A::*) (int)> function1 = std::bind(A::func, this, std::placeholders::_1);
function1();
关于bind的介绍可以看这里API Reference Document std::bind
c++中的类成员函数指针的更多相关文章
- 类成员函数指针的特殊之处(成员函数指针不是指针,内含一个结构体,需要存储更多的信息才能知道自己是否virtual函数)
下面讨论的都是类的非静态成员函数. 类成员函数指针的声明及调用: 1 2 3 4 5 6 7 //pr是指向Base类里的非静态成员函数的指针 //其行参为(int, int),返回值为void vo ...
- C++的类成员和类成员函数指针
类成员函数指针: 用于访问类成员函数,和一般函数指针有区别. 类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以.调用时也要通过对象调用. 而对于类的静态成员 ...
- C/C++ 类成员函数指针 类成员数据指针
普通函数指针: "return_type (*ptr_name)(para_types) " 类成员函数指针: "return_type (class_name::*p ...
- C++函数指针和类成员函数指针
一.函数指针——基本形式 char Fun(int n) { return char(n); } //char(*pFun)(int); void main() { char(*pFun)(int); ...
- 类成员函数指针 ->*语法剖析
在cocos2d-x中,经常会出现这样的调用,如 ->*,这个是什么意思呢,如下面得这个例子: , 其实这是对类的成员函数指针的调用,在cocos2dx中,这种形式多用于回调函数的调用.如我们经 ...
- 使用std::function 把类成员函数指针转换为普通函数指针
前言 这是改造前一篇 设计模式 的基础,使通知者不必知道观察者的类名和函数名,只需要知道更新函数的原型即可. 开发环境:WIN7 32位 + VS2010 发现在VS2005中使用std::funti ...
- C++中的类成员指针
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- 关于C++中的非静态类成员函数指针
昨天发现了一个问题,就是使用对类中的非静态成员函数使用std::bind时,不能像普通函数一样直接传递函数名,而是必须显式地调用&(取地址),于是引申出我们今天的问题:非静态类成员函数指针和普 ...
- 从汇编看c++成员函数指针(三)
前面的从汇编看c++中成员函数指针(一)和从汇编看c++成员函数指针(二)讨论的要么是单一类,要么是普通的多重继承,没有讨论虚拟继承,下面就来看一看,当引入虚拟继承之后,成员函数指针会有什么变化. 下 ...
- 从汇编看c++成员函数指针(二)
下面先看一段c++源码: #include <cstdio> using namespace std; class X { public: virtual int get1() { ; } ...
随机推荐
- utf-8 - 如何修复 'character map file ` UTF-8' not found'
正在设置一个 UBI rhel8 容器.我需要执行这个命令: localedef -f UTF-8 -i en_US en_US.UTF-8 失败了: character map file `UTF- ...
- localhost 宿主机访问
ssh -N -f -L localhost8888:localhost:8888 hostname
- 使用Spring提供的BeanUtils.copyProperties()方法报错:Could not copy property 'xxx' from source to target
使用Spring提供的BeanUtils.copyProperties()方法报错:Could not copy property 'xxx' from source to target; neste ...
- Qt/C++音视频开发60-坐标拾取/按下鼠标获取矩形区域/转换到视频源真实坐标
一.前言 通过在通道画面上拾取鼠标按下的坐标,然后鼠标移动,直到松开,根据松开的坐标和按下的坐标,绘制一个矩形区域,作为热点或者需要电子放大的区域,拿到这个坐标区域,用途非常多,可以直接将区域中的画面 ...
- [转]E1接口介绍
E1 通道本来设计用来传输电话的,每个 E1(带宽 2.048M)可以传 30 路电话,后来扩大的应用范围,可以用作传网络,串口等不同的业务:E1 是一个基本的传输单元,其最终还是通过光纤来传输的,如 ...
- Java实现拍卖系统详解
一.项目背景与需求分析 随着互联网技术的飞速发展,电子商务领域不断拓展新的业务模式,在线拍卖系统应运而生并逐渐成为一种重要的商业交易方式.在当今数字化的时代,人们越来越倾向于通过网络平台进行各类交易活 ...
- JMeter JSR223 Sampler 教程:性能测试的魔法棒
JMeter JSR223 Sampler 教程:性能测试的魔法棒 宝子们,今天咱要深入探索 JMeter 里超厉害的 JSR223 Sampler,它就像是一把万能钥匙,能打开性能测试的各种奇妙大门 ...
- Ubuntu Jack-server报错解决方案
报错关键部分如下: Communication error with Jack server (35), try 'jack-diagnose' or see Jack server log 究其原因 ...
- Note - 两类容斥
\(\S1.\) 等价容斥 (乱取的名字.) 题目将组合对象构成的 "等价类" 进行了定义和限定. 我们往往无法计数 "等价类真的长这样" 的方案, 而 ...
- 项目PMP之十二项目采购管理
项目PMP之十二--项目采购管理 一.定义:存在法律义务,需要对采购过程了解,非法律专家,合同约束 项目经理无权签署对组织有约束力的法律文件 采购模式: 分散式采购:无采购管理部门,项目经理有采购 ...