函数指针调用类成员函数的解决方案

IMU数据处理避坑指南:从理论到实践的加速度计重力消除方案 本文详细解析了IMU数据处理中的重力消除技术,从理论基础到实践应用,涵盖了加速度计和陀螺仪的核心问题。通过ROS2实战案例,介绍了静态标定与动态校准的技术对比,以及多传感器融合的进阶策略,帮助开发者避免常见陷阱,提升IMU数据处理的精度和效率。 阅读详情

    如果碰到在一个类中通过函数指针调用成员函数的要求。比如:在一个类中使用了 STL的排序函数qsort时,因qsort参数需要一个比较函数指针,如果这个类使用某个成员函数做比较函数,就需要将这个成员函数的指针,也就是成员函数名,传给qsort供其调用。

    如以下三种情况就会出现编译错误:

    1 将类的成员函数指针赋予同类型非成员函数指针

#include<stdlib.h>
#include<iostream>
typedef void (*Function1)();//定义一个函数指针类型
Function1 f1;
class Test1
{
public:
 void Memberfun1()
 {
  std::cout<<"Calling Test3::Memberfun2 OK"<<'/n';
 }
 void Memberfun2()
 {
  f1=reinterpret_cast<Function1>(Memberfun1);//将成员函数指针赋予f1, 编译错误
  f1();
 }
};
int main()
{
 Test1 t1;
 t1.Memberfun2();
 return 0;
} 

    2 在一个类中,有标准库函数,如 qsort或其他全局函数,用函数指针调用类的成员函数

#include<stdlib.h>
#include<iostream>
class Test2
{
private:
 int data[2];
public:
 int _cdecl Compare(const void* elem1,const void* elem2)
 {
  std::cout<<"Calling Test2::Memberfun OK"<<'/n';//如改为static函数可以成功
 }
 void Memberfun()
 {
  data[0]=2;
  data[1]=5;
  //标准库函数调用成员函数,编译出错
  qsort(data,2,sizeof(int),Compare);
 }
};
int main()
{
 Test2 t2;
 t2.Memberfun();
 return 0;
}

   3 同一个类中,一个成员函数调用另一个成员函数

#include <stdio.h>
#include <iostream>
class Test3
{
public:
 void Memberfun1(void (*f2)())
 {
  f2();
 }
 void Memberfun2()
 {
  std::cout<<"Calling Test3::Memberfun2 OK"<<'/n';   / /如改为static函数可以成功
 }
 void Memberfun3()
 {
  Memberfun1(Memberfun2);//出错
 }
};
int main()
{
 Test3 t3;
 t3.Memberfun3();
 return 0;
}

    以上都会编译错误,但是如果将类的外衣脱掉,如下代码所示,编译正确且运行正常。

#include <stdio.h>
#include <iostream>

 void Memberfun1(void (*f2)())
 {
  f2();
 }
 void Memberfun2()
 {
  std::cout<<"Calling Test3::Memberfun2 OK"<<'/n';  / /如改为static函数可以成功

 }
 void Memberfun3()
 {
  Memberfun1(Memberfun2);//出错
 }

int main()
{
 //Test3 t3;
 /*t3.*/Memberfun3();
 return 0;
}

    原因其实很难表述,简单说就是因为类的成员函数里面并不那么纯洁,它附带了很多其他信息,如:每个成员函数都拥有this指针等等。

    那么如何解决这个问题,实现指针调用类的成员函数 也就是说将函数名作为另一个函数的参数?

    1 在每个被调用函数之前加上static, 可以使成员函数脱离对象信息单独存在,虽然它属于这个类,但是没有附带上对象信息,但是前提是,static成员函数不能使用对象的信息(成员和函数)。

    2 使用一个全局函数做中转,间接调用成员函数,如下代码修改Test3:

#include <stdio.h>
#include <iostream>
class Test3;
void _cdecl Helper(Test3 *test3);

class Test3
{
public:

void Memberfun1(void (*f2)(Test3 *))
 {
  f2(this);
 }
 void  Memberfun2()
 {
  std::cout<<"Calling Test3::Memberfun2 OK"<<'/n';
 }
 void Memberfun3()
 {
  //Memberfun1(Memberfun2);//出错
  Memberfun1(Helper);
 }
};
void _cdecl Helper(Test3 *test3)
{
 test3->Memberfun2();
}

int main()
{
 Test3 t3;
 t3.Memberfun2();
 return 0;
}

3 使用一个函数参数函数对象信息的static类型的成员函数中转,间接调用其它成员函数。

#include <stdio.h>
#include <iostream>
class Test3
{
public:
 static void _cdecl Helper(Test3 *test3)
 {
  test3->Memberfun2();
 }

 void Memberfun1(void (*f2)(Test3 *))
 {
  f2(this);
 }
 void  Memberfun2()
 {
  std::cout<<"Calling Test3::Memberfun2 OK"<<'/n';
 }
 void Memberfun3()
 {
  Memberfun1(Helper);
 }
};

int main()
{
 Test3 t3;
 t3.Memberfun2();
 return 0;
}

    由此可见,函数指针不能直接调用类的成员函数,因为成员函数指针和一般函数指针有着本质差别,因为成员函数带有很多对象信息。要解决调用的问题,应该使用static或者全局函数,实现间接调用。

OpenCV计算机视觉实战(11)——边缘检测详解 在本节中,我们系统介绍了三大经典边缘检测算子,包括 Sobel 算子:一阶导数平衡了噪声抑制与边缘提取,结合方向信息可用于纹理分析与车道检测;Laplacian 算子:二阶导数对微小亮度突变尤为敏感,配合零交叉和细化技术,可精确捕捉任意方向的细节边缘;Canny 算法:集成多阶段处理与双阈值策略,通过多尺度融合与自适应阈值优化,达到抗噪与细节兼顾的卓越效果。 阅读详情

相关推荐

AI驱动Spine骨骼动画生成:从图像拆分到动画自动化的全流程解析

计算机视觉与生成式AI技术正深度赋能传统数字内容生产流程。在2D动画制作领域,骨骼动画技术通过模拟真实生物关节运动,实现了角色动画的高效制作与灵活控制。其核心原理在于将角色拆分为独立部件,通过骨骼层级关系驱动部件变换,结合关键帧插值算法生成流畅动作。这项技术的工程价值在于大幅降低动画制作门槛,提升内容生产效率,尤其适用于游戏开发、影视预演、广告设计等需要快速原型迭代的场景。本文聚焦于如何利用SIFT特征匹配、RANSAC几何验证等CV算法实现部件自动对位,并结合动画12原则的程序化实现,构建从单张角色立绘到

weixin_28696185的博客 1513

成员函数指针的用法

一、成员函数指针的用法 在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*"用于指针的声明,而"->*"和".*"用来调用指针指向的函数。比如:

u013500944的专栏 1864

BPMN2.0规范及流程引擎选型方案

本文主要简明扼要的介绍了BPMN2.0规范的内容,可让读者快速度的了解BPMN2.0所涵盖的主要内容和图形样式。也较为详细的阐述了如何绘制标准的流程图,以及在软件层面中如何实现业务流程功能,和技术选型。

比特桃 1万+

通过函数指针调用类成员函数的方法

通过函数指针调用一个函数的时候,此函数必须有具体的地址,因此当调用一个类成员函数的时候,此成员函数必须声明为static,即静态成员函数,这样就能通过函数指针获取到成员函数的地址,进而调用。

JunJie的个人博客 5495

玩转 Milvus(二):在 Ubuntu 22.04(WSL2)上安装 Milvus

本文详细介绍了在Ubuntu 22.04(WSL2)环境下安装Milvus向量数据库的两种单机模式:Milvus Lite和Milvus Standalone。Milvus Lite作为轻量级Python库,适合快速学习和小规模实验,只需通过pip安装即可使用。Milvus Standalone则支持Docker和Docker Compose两种部署方式,适合开发测试或小规模生产环境。文章对比了不同安装方式的优缺点,并提供了验证案例和常见问题解答,帮助开发者快速上手,实现简单的语义搜索功能。

企业级后端与 AI 应用开发双线探索 2507

西门子1200,与V90和步科MD60第三方伺服PN通讯

需要注意的是回零方式的选择,因为V90是绝对值编码器,这里回零模式选择模式7,系统自动根据编码器反馈以及组态的机械参数,计算出轴的位置,并且掉电保持。在线访问中,找到对应的网卡,以及下面扫描到的设备,可以在线修改ip地址和profinet名称,注意一定要和组态中的完全一致。以上硬件组态上完成,主要是gsd文件导入后,添加硬件,建立连接,修改ip和profinet名称,添加报文。1- 博图V18内,设备组态,网络视图中,拖入V90以及MD60伺服,并与PLC创建连接。向厂家索要GSD文件,PN的描述文件。

weixin_37596954的博客 2461

[C++] 使用指针调用类成员方法

任何指向“类”的成员函数指针,由于携带额外的所属对象信息,与一般的函数有根本的不同,不能直接用来进行函数调用。用C++ 描述:对于类class MyClass 中的成员函数 void Method(); ,它的函数类型为void (MyClass::*f)(); 而不是void (*f)(); 。

qq_18826027的博客 5928

STM32 HAL库定时器中断实现步进电机S型加减速控制与脉冲精准计数

本文详细介绍了如何使用STM32 HAL库定时器中断实现步进电机的S型加减速控制与脉冲精准计数。通过CubeMX配置定时器、计算PSC和ARR值,并结合S型曲线算法,实现平滑启停和精准定位。文章还提供了脉冲计数方案和常见问题排查技巧,帮助开发者优化步进电机控制性能。

weixin_29189363的博客 373

函数指针调用类的成员函数

class A { public: void func(){ printf("ff\n");}; typedef void(A::*B)();//这个函数指针在类里面和外面都要这样 map mp; void g() { mp["11"] = &A::func; } void call() { (this->*mp["11"])(); } }; typedef

webgpu 663

【自动驾驶轨迹规划之hybrid A*算法】

本文参考论文:https://ai.stanford.edu/~ddolgov/papers/dolgov_gpp_stair08.pdf 这篇文章是基于经典A*算法与reeds-shepp曲线的,不清楚的读者请参考【自动驾驶轨迹规划5之A*算法】_无意2121的博客-优快云博客【自动驾驶轨迹规划之dubins曲线与reeds-shepp曲线】_无意2121的博客-优快云博客 目录 1 hybrid A* 算法创新点 1.1 搜索方式 1.2 车辆运动学模型 1.3 reeds-shepp曲

weixin_65089713的博客 1万+

YOLOv12中的A2C2f模块详解,涉及区域注意力模块(A2)和 R-ELAN 结构详解

区域注意力模块(Area Attention, A2)的设计出发点是为了解决传统注意力机制在计算复杂度和内存访问效率上的问题。传统的自注意力机制(Self-Attention)具有二次方的计算复杂度(O(n²)),尤其是在处理高分辨率图像时,计算成本非常高。此外,注意力机制的内存访问模式不如卷积神经网络高效,导致在实际应用中难以满足实时性要求。区域注意力模块通过将特征图划分为多个区域,并在每个区域内进行注意力计算,从而显著降低了计算复杂度。

Limiiiing的博客 5513

类的成员函数指针和静态成员函数指针 调用成员函数***

C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的。而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是自己独有的。 #include<iostream> class Person { public: void ordinaryfunc();//声明一个普通成员函数 vo...

随意的风的专栏 3122

【QT/C++】事件过滤器之基于重写 eventFilter 方法的多种常见应用场景及实现

Qt事件过滤器通过重写eventFilter方法实现多种实用功能:1)鼠标事件处理(点击全选文本、禁用滚轮、悬停提示);2)键盘事件处理(输入内容限制、快捷键提交);3)焦点事件处理(自动弹出下拉框、实时验证);4)绘图事件处理(自定义控件绘制);5)窗口事件处理(防止意外关闭、尺寸限制)。事件过滤器提供非侵入式的事件处理方案,相比传统子类化方式更灵活,通过installEventFilter安装到目标控件即可实现各种交互增强功能。

yuhuasheng1997的博客 1483

关于类成员函数指针的调用问题

 关于类成员函数指针的调用问题 在学习二叉树的时候,定义了一个二叉树类BinTree。类中定义了按不同顺序遍历二叉树的成员函数(如前序遍历函数PreOrder(void(*visit)(BTNode* p))),其形参列表中使用了一个指向访问函数Travse(BTNode* p)的*visit指针。当按照如下方式定义类的两个成员函数PreOrder、Travse时:template

scuhank的专栏 2473

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++指针直接调用类成员函数探讨

C++指针直接调用类成员函数探讨 From: http://blog.youkuaiyun.com/tan625747/article/details/4947289 摘要 本文分析了C++编程中用指针调用“类” 成员函数时出现的问题、原因及后果,讨论了一般函数指针和“类”成员函数指针的不同。得出结论: 任何指向“类”的成员函数指针,由于携带额外的所属对象信

云里雾里的专栏 1425

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++类成员函数做参数以及转换调用

最近项目过程中由于代码重构,想精简代码的时候发现类的成员函数重构出现了无法赋值给封装函数作为参数的问题。有一定基础的coder应该都知道其中有隐含this成员的原因,但在用法上网上资料虽多但没有一个较为具体的程序范例,于是我写下了下面一段代码,供大家分析参考: #include "stdafx.h" #include  class Test { public: type

u011526858的博客 1886

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C++ 类成员函数的函数指针

当我们在 C++ 中直接像 C 那样使用类的成员函数指针时,通常会报错,提示你不能使用非静态的函数指针:两个解决方法:关于函数指针的定义和使用你还不清楚的话,可以先看这篇博客了解一下:C/C++ 函数指针void (*ptrStaticFun)() = &ClassName::staticFun;void (ClassName::*ptrNonStaticFun)() = &ClassName::nonStaticFun;注意调用类中非静态成员函数的时候,使用的是 类名::函数名,而不是 实例名::函数名。

Godchar的博客 835

转: C++指针直接调用类成员函数探讨

在编程工作中常会遇到在一个“类”中通过函数指针调用成员函数的要求,如,当在一个类中使用了C++标准库中的排序函数qsort时,因qsort参数需要一个“比较函数”指针,如果这个“类”使用某个成员函数作“比较函数”,就需要将这个成员函数的指针传给qsort供其调用。本文所讨论的用指针调用 “类”的成员函数包括以下三种情况:  (1).将 “类”的成员函数指针赋予同类型非成员函数指针,如:  例子1#

E.G的专栏 425

C++类成员函数中的函数指针参数

今天整代码,为了减少代码冗余,新定义了一个带函数指针形参的成员函数,然后将几处代码改为调用这个成员函数,一编译就出错了:cannot convert parameter 1 from struct GradientVector (const struct GradientVector &,int) to struct GradientVector (__cdecl *)(const stru

happynp的专栏 1002

【C++ 基础 11】 函数指针总结

在家学习的效率真是惨不忍睹。。 =========================== 1 指针函数 int* f(int a, int b);返回一个指向int类型的指针。 2 函数指针 2.1 声明 返回类型 (*函数名)(参数列表); 2.2 示例 int max(int a, int b) { return a > b ? a : b; ...

weixin_34221775的博客 210

C++指针直接调用类成员函数探讨(zz)

在编程工作中常会遇到在一个“类”中通过函数指针调用成员函数的要求,如,当在一个类中使用了C++标准库中的排序函数qsort时,因qsort参数需要一个“比较函数”指针,如果这个“类”使用某个成员函数作“比较函数”,就需要将这个成员函数的指针传给qsort供其调用。本文所讨论的用指针调用 “类”的成员函数包括以下三种情况:  (1).将 “类”的成员函数指针赋予同类型非成员函数指针,如:  例子1#...

weixin_34239592的博客 143

类成员函数指针

写类成员函数,一直失败,唉,一直遇到C2064错误,好歹msdn给了实例,真不错:)http://msdn.microsoft.com/zh-cn/library/z72c1dfd(VS.80).aspx1.首先定义指针就和其他的不一样://class.htypedef HRESULT (Class::*FNNAME)(DISPPARAMS*);2. 指针的赋值也不同:FN

norsd的专栏 1121

木老师教笨笨课堂——系列讲座(从函数指针到委托) 三、C++语言里的函数指针...

先来回顾一下,我们说函数指针有一个重要的特性,它可以指向任何形参相同的函数。这样可以用统一的方式去调用不同的函数。(这个我还是希望笨笨同学好好思考一下,我想也是程序思想的精髓之一吧),就好比武功秘籍中九字真言一般。“统一的方式去调用不同的实现”,如果在面向对象里就是“多态”二字。 C++语言里当然也有函数指针。面向对象的引入,出现了类、对象的概念。以前函数指针只是指向的一般的函数,或者说是全局函...

weixin_33860737的博客 130

关于在C++内用指针调用类的成员函数

在编程工作中常会遇到在一个“类”中通过函数指针调用成员函数的要求,如,当在一个类中使用了C++标准库中的排序函数qsort时,因qsort参数需要一个“比较函数”指针,如果这个“类”使用某个成员函数作“比较函数”,就需要将这个成员函数的指针传给qsort供其调用。本文所讨论的用指针调用 “类”的成员函数包括以下三种情况:  (1).将 “类”的成员函数指针赋予同类型非成员函数指针,如:  

happy5856的专栏 1466

C++builder类成员函数作为线程回调函数

C++builder中提供了_beginthread函数,和C++标准库中的相应似. 普通调用,方法如下: #include <process.h> #include <stddef.h> #include <utilcls.h> void test1(void * p) { OLETRACE("类成员变量m_msg=%d,线程ID=%d",(int...

chinayu2007的专栏 803
上一篇: 函数指针调用类成员函数的问题----对象模型的困惑
下一篇: 在vc中自定义事件扩展控件功能
burningcpu
博客等级 码龄20年 13粉丝 83原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值