首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

c++类成员函数指针在类中不能正常工作

C++类成员函数指针在类中不能正常工作是因为类成员函数指针与普通函数指针有所不同。类成员函数指针需要同时存储函数地址和对象指针,以便正确地调用类成员函数。

在C++中,类成员函数指针的类型包含了成员函数的参数和返回值类型,以及类的类型信息。因此,类成员函数指针的类型与普通函数指针的类型不同。

当我们尝试将类成员函数指针作为普通函数指针使用时,由于缺少对象指针,无法正确调用类成员函数。这是因为类成员函数需要通过对象来访问类的成员变量和其他成员函数。

为了解决这个问题,可以使用静态成员函数或者将类成员函数指针与对象绑定的方法来实现类成员函数的正常工作。

静态成员函数是不依赖于任何对象的函数,可以直接通过类名调用。静态成员函数没有this指针,因此可以作为普通函数指针使用。但是需要注意的是,静态成员函数无法访问非静态成员变量。

另一种方法是使用std::bind或者Lambda表达式将类成员函数与对象绑定,生成一个可调用对象。这样可以在调用时传递对象指针,从而正确地调用类成员函数。

总结起来,类成员函数指针在类中不能正常工作是因为缺少对象指针的信息。可以通过使用静态成员函数或者将类成员函数与对象绑定的方法来解决这个问题。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数计算(云原生应用开发):https://cloud.tencent.com/product/scf
  • 腾讯云云服务器(服务器运维):https://cloud.tencent.com/product/cvm
  • 腾讯云数据库(数据库):https://cloud.tencent.com/product/cdb
  • 腾讯云音视频处理(音视频处理):https://cloud.tencent.com/product/mps
  • 腾讯云人工智能(人工智能):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(物联网):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动开发):https://cloud.tencent.com/product/mobdev
  • 腾讯云对象存储(存储):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(区块链):https://cloud.tencent.com/product/baas
  • 腾讯云虚拟专用网络(网络通信):https://cloud.tencent.com/product/vpc
  • 腾讯云安全产品(网络安全):https://cloud.tencent.com/product/saf
  • 腾讯云游戏多媒体引擎(多媒体处理):https://cloud.tencent.com/product/gme
  • 腾讯云元宇宙(元宇宙):https://cloud.tencent.com/product/mu
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++成员指针

1.成员指针简介 成员指针C++引入的一种新机制,它的申明方式和使用方式都与一般的指针有所不同。成员指针分为成员函数指针成员数据指针。 2....成员函数指针 事件驱动和多线程应用中被广泛用于调用回调函数多线程应用,每个线程都通过指向成员函数指针来调用该函数。在这样的应用,如果不用成员指针,编程是非常困难的。...*memP)(); } 程序正常运行并输出: name:lvlv 使用成员函数指着注意两点: (1)使用成员函数指针时需要指明成员函数所属的对象,因为通过指向成员函数指针调用该函数时,需要将对象的地址用作...this指针的值,以便进行函数调用; (2)为成员函数指针赋值时,需要显示使用&运算符,不能直接将名::成员函数名赋给成员函数指针。...要解决这个问题,将函数printArray()设置为ArrayClass的友元函数是不行的,因为是调用该函数是访问了ArrayClass的私有成员,而不是函数体内用到ArrayClass的私有成员

1.3K10

C++ 成员指针

文章目录 1.成员指针简介 2.成员函数指针 3.数据成员指针 1.成员指针简介 成员指针C++ 引入的一种新机制,它的申明方式和使用方式都与一般的指针有所不同。...成员指针分为成员函数指针和数据成员指针。 2.成员函数指针 事件驱动和多线程应用中被广泛用于调用回调函数多线程应用,每个线程都通过指向成员函数指针来调用该函数。...*memP)(); } 程序正常运行并输出: name:lvlv 使用成员函数指着注意两点: (1)使用成员函数指针时需要指明成员函数所属的对象,因为通过指向成员函数指针调用该函数时,需要将对象的地址用作...this指针的值,以便进行函数调用; (2)为成员函数指针赋值时,需要显示使用&运算符,不能直接将“名::成员函数名”赋给成员函数指针。...要解决这个问题,将函数printArray()设置为ArrayClass的友元函数是不行的,因为是调用该函数时访问了ArrayClass的私有成员,而不是函数体内用到ArrayClass的私有成员

75730

C++成员函数 | 成员函数

C++成员函数的性质 C++成员函数函数的一种,它有返回值和函数类型,它与一般函数的区别只是:  属于一个成员,出现在。...C++使用函数时,要注意调用它的权限以及它的作用域,私有的成员函数只能被本类的其他成员函数所调用,而不能外调用,成员函数可以访问本类任何成员,可以引用在本作用域中有效的数据。 ...C++,有的函数并不是准备为外界调用的,而是为本类成员函数所调用的,就应该将它们指定为 private。...这种函数的作用是支持其他函数的操作,是其他成员函数外用户不能调用这些私有的函数。  成员函数十分重要的部分。...C++外定义成员函数 上述所讲成员函数定义的,C++也可以只写成员函数的声明,而在的外面进行函数定义。

1.8K74

C++的this指针,静态成员,友元函数友元

---- 1. this指针 在上篇讲C++,对象,封装,继承(派生),多态的时候,this指针出现在成员函数,并使用->成员提取符操作成员变量。... C++ ,每一个对象都能通过 this 指针来访问自己的地址,this 指针是所有成员函数的隐含参数,实际上成员函数默认第一个参数为T* const register this,this指针成员函数的开始执行前构造的...,它可以用来指向调用对象,并且只可以成员函数调用,对于全局函数,静态函数,友元函数,都不能使用this指针。...所以this指针不能在静态函数中使用,静态函数如同静态变量一样,他不属于具体的哪一个对象,静态函数表示了整个范围意义上的信息,而this指针却实实在在的对应一个对象,所以this指针不能被静态函数使用...友元函数友元 所谓友元函数,就是,用friend关键字声明一个函数,这个函数的声明,但不作为成员函数,虽然友元函数不属于成员函数,却可以访问成员,不论成员是public,pirvate

1.4K10

C++C++ 的 this 指针用法 ② ( 常量成员函数 | const 修饰成员函数分析 )

一、常量成员函数 1、const 修饰成员函数分析 C++ , 普通的非静态成员函数 , 可以使用 const 进行修饰 , 下面的 Student , 定义了 void fun(int... * 右边修饰的是指针本身 ; 代码示例 : class Student { public: // 使用 const 修饰 成员函数 // const 关键字可以 // void...使用 const 关键字 修饰成员函数 , 会将 成员函数 转化为 " 常量成员函数 " ; " 常量成员函数 " 操作限制 : 不能修改成员变量 : 不能修改 任何 成员变量 值 , 静态成员变量...与 非静态普通成员变量 都不能修改 ; 不能调用非常量成员函数 : 只能调用 " 常量成员函数 " , 不能调用 非常量成员函数 , 以保证不会修改 成员变量 ; " 常量成员函数 " 只能访问 常量成员变量...; // 身高 如果 成员函数 被 const 关键字 声明为 常量成员函数 , 则在该函数 不能修改 对象的 任何成员变量 ; class Student { public: void fun

17420

C++:33---成员指针

数据成员指针的定义 特点: 需要使用*来表示当前的变量是一个指针 成员指针定义时必须包含所属的 指针的定义 下面定义一个指向Screen对象的指针指针的类型为string,并且指针为常量指针(因此不能通过这个指针修改值...->contents 返回数据成员指针函数 在上面定义成员指针的时候,pdata不能出现在Screen的外部,因为contents是private的(上面只是为了演示说明) 为了体现封装性,我们通常定义一个成员函数...,我们可以正常的使用这个指针。...成员函数指针之间不存在自动转换规则 使用成员函数指针 和使用数据成员指针一样,我们需要使用....因为成员指针不是可调用对象,所以我们不能直接将一个指向成员函数指针传递给算法 例如,下面一个vector寻找第一个空的string: std::vector svec;auto

81630

C++和对象以及成员函数

参考链接: 如何通过C++函数传递和返回对象? 一个实体拥有自己的属性和行为,属性是私有的,行为是共有的,C++实体对应的就是对象,实体抽象数据类型就是,属性是成员变量,行为是成员函数。 ...C++,结构体默认是全部都可见的,而默认是私有的。 ...所以我们进行函数设计的时候,应尽量避免返回成员变量的指针,修改到成员变量的值导致程序bug。 ...那么定义和外定义有什么区别呢??  ①如果在定义,函数调用的时候编译器会当做内联函数处理,调用点将代码展开;  ②如果在外定义,函数调用时和普通函数一样,进行栈桢的开辟和回退。 ...:CGoods *constthis,this指针的指向不能改变。

1.3K20

成员函数指针成为可调用对象

成员函数指针实践上是一个指针类型,不可直接通过调用运算符()作为可调用对象调用,一般调用该类成员函数指针需要指定该指针对应的对象。     ...的成员函数指针类型 int main() {     pClassF pf= &A::print; // 定义成员函数指针,不支持函数指针的自动转换     A a;     (a....>的std::function模板: 因为成员函数执行时,会在参数列表添加参数--隐式的this实参,function模板调用时可以传入对象实现this的功能(传入的对象不一定是指针类型...),function判断如果是成员函数指针,则会将通过该对象使用成员访问运算符,实现成员函数指针的调用功能(具体function如何判断是成员函数指针还是普通函数指针,本人现在不清楚,如果有理解错误地方望指正...可调用对象里有接收对象与对象指针的一组调用运算符重载函数,可使用对象或对象指针调用该成员函数,使用方式与function相同: // main.cpp,头文件a.h与源文件a.cpp之前相同 #

1K40

C++C++ 的 this 指针用法 ① ( C++ 的 this 指针引入 | this 指针用法 | 代码示例 )

一、C++ 的 this 指针 1、C++ 的 this 指针引入 C++ , this 指针 是一个特殊的指针 , 由系统自动生成 , 不需要手动声明定义 , 的每个 非静态成员函数..., 因此 this 指针内部使用的指针 , 使用 this 可以访问 实例对象 的所有 公有 public / 保护 protected / 私有 private 成员 ; 2、C++ 的...this 指针用法 C++ 的 this 指针用法 : 使用 this 作为指针 : 非静态成员函数 , 直接使用 this 作为 本实例对象 的指针 ; this 使用 this-> 访问成员变量...访问成员变量 : 非静态成员函数 , 直接使用如下语法 , 访问 本实例对象 的 非静态成员变量 ; 先获取指针指向的数据 然后访问数据成员变量 ; (*this).成员变量名 C++... , 定义了 成员变量 age 和 height , 构造函数 中进行初始化 , 可以使用 this-> age 访问 age 成员变量 , 使用 this->height 访问 height

22920

C++】泛型编程 ⑮ ( 模板示例 - 数组模板 | 自定义持有指针成员变量 )

一、支持 数组模板 存储的 自定义 1、可拷贝和可打印的自定义 在上一篇博客 , 定义了 可拷贝 与 可打印 的 自定义 Student , 可以被存放到 数组模板 ; 由于其 成员变量..., 开始讨论 自定义 是 char* 类型指针的情况 , 这里涉及到了 堆内存分配 以及 深拷贝 问题 ; 如果将上述 Student 的 char m_name[32] 数组成员 , 改为 char...* m_name 指针成员 ; 那么需要进行 堆内存管理 , 构造函数 分配堆内存 ; 析构函数 释放堆内存 ; 为了避免 浅拷贝 问题出现 , 需要 进行 等号 = 运算符重载 ; 以及...重写 拷贝构造函数 ; 为了使用 cout 打印该 对象 , 需要 进行 左移 << 运算符重载 ; 3、改进方向 - 构造函数 的 无参构造函数 和 有参构造函数 , 使用 new 关键字 ,...s); } 然后 , 外部 的 全局函数 , 实现 重载左移运算符函数 ; // 重载左移运算符实现 ostream& operator<<(ostream& out, const Student

13310

C++的静态数据成员和静态成员函数

我们需要一个成员为所有对象所公有,而且需要更新这个公有属性的时候只需修改一次。 因此,C++提供了静态数据成员来描述对象相同的属性。...定义的时候非静态数据成员是不分配内存的,只有创建对象的时候才分配内存,但静态数据成员是要分配内存的,因为它是属于的,只有一块内存,所以要初始化它,而且不能的声明初始化,必须要在外初始化...静态成员函数 一般都是静态成员函数修改静态数据成员刚刚的手机声明成员函数: static void change(); 就是静态成员函数。...我们给它来一个外定义: void redmik30pro::change() { battery-=10; } 要注意的是,静态成员函数只能访问静态数据成员和静态成员函数不能访问非静态数据成员,如果要访问非静态数据成员...首先,可能你在做题的时候,题目要求你使用静态成员函数完成任务…… 开个玩笑啦…… 静态成员函数没有this指针,因为它在创建的时候就存在了,没有创建对象的时候就已经存在静态成员函数,而普通函数必须在对象被创建的时候才能被使用

14730

《挑战30天C++入门极限》C++静态数据成员静态成员函数

C++静态数据成员静态成员函数   没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在范围内共享数据呢...以下程序我们来做一个模拟访问的例子,程序,每建立一个对象我们设置的静态成员变自动加一,代码如下: #include using namespace std;...便运行加1操作,静态成员的初始化应该在主函数调用之前,并且不能的声明中出现,通过运行过程的观察我们发现,静态成员count的状态并不会随着一个新的对象的新建而重新定义,尽而我们了解到静态成员函数由于与对象无关系...,所以在其中是不能的普通成员进行直接操作的。   ...;//错误 cout<<count<<endl; }   静态成员函数与普通成员函数的差别就在于缺少this指针,没有这个this指针自然也就无从知道name是哪一个对象的成员了。

66730

不报错地调用空指针成员函数

return 0; }   运行结果: a->print() 输出:>>>>> a->print2() 输出:+++++ a->print3() 程序段错误   前两个应该都会段错误才对的呀,怎么都运行正常了...其实上述的行为都由this指针左右结果。 0x00 静态函数没有this指针   静态方法随着的加载而加载,静态方法不需要实例化。...0x01 成员函数不使用this指针不报错 a->print();可以近似看作void print(A *a): void print(A *a) { printf("+++++\n"); }...0x02 空指针引用实例成员才会异常 void print3()中使用了实例a的value成员,由于a为空,没有指向具体的内存,导致引用value内存出错。...0x03 总结   上述行为引起段错误的原因是空指针实例引用了成员变量导致的。

1.2K20
领券