0

0

C++语法错误:成员函数指针不能指向非成员函数,要怎么处理?

王林

王林

发布时间:2023-08-22 16:43:47

|

1932人浏览过

|

来源于php中文网

原创

c++语法错误:成员函数指针不能指向非成员函数,要怎么处理?

在C++编程中,成员函数指针是指向类的成员函数的指针。使用成员函数指针可以在运行时动态地选择要调用的成员函数,这是一种非常有用的技术。然而,有时候我们会遇到一个问题,就是成员函数指针不能指向非成员函数,这时我们该怎么处理呢?

首先,需要了解为什么成员函数指针不能指向非成员函数。这是因为非成员函数的类型和成员函数的类型不同,成员函数需要隐含传递this指针,以便访问类的成员变量和函数。因此,成员函数指针保存的是成员函数的地址和类的指针,而非成员函数没有this指针,无法访问类的成员变量和函数,因此成员函数指针无法指向非成员函数。

我们可以通过一些技巧来解决这个问题。下面是一些解决方案:

  1. 使用仿函子(Functor)或Lambda表达式

仿函子是一种实现了函数调用运算符的类。我们可以通过重载函数调用运算符,使得类的对象可以像函数一样被调用。因此,我们可以使用仿函子来实现成员函数的功能,从而使成员函数指针可以指向这个仿函子对象。Lambda表达式也可以实现相同的功能。

立即学习C++免费学习笔记(深入)”;

下面是一个使用仿函子的例子:

#include 

class MyClass {
public:
    void foo() {
        std::cout << "Hello from foo!";
    }
};

class FunctionObject {
public:
    void operator()() {
        obj.foo();
    }
    MyClass obj;
};

int main() {
    FunctionObject f;
    f();
    return 0;
}

上面代码中,我们定义了一个FunctionObject类,它包含了一个MyClass对象和一个operator()函数,当仿函子对象被调用时,会调用operator()函数,从而调用MyClass的foo函数。

我们可以将FunctionObject对象的地址传递给成员函数指针,就可以调用foo函数。例如:

一帧秒创
一帧秒创

基于秒创AIGC引擎的AI内容生成平台,图文转视频,无需剪辑,一键成片,零门槛创作视频。

下载
void (MyClass::*func_ptr)() = &MyClass::foo;
FunctionObject f;
MyClass* p = &(f.obj);
(p->*func_ptr)();

上面代码中,我们定义了一个成员函数指针func_ptr,指向MyClass的foo函数。然后,我们创建了一个FunctionObject对象f,并将它的obj成员的地址赋值给了MyClass指针p。最后,我们使用成员访问运算符(p->*)和成员函数指针func_ptr来调用foo函数。

  1. 使用全局函数和void*指针

另一种解决方法是使用全局函数和void指针。我们可以定义一个全局函数,它接受一个void指针作为参数,并将其转换为类的指针,并调用成员函数。然后,我们可以将这个全局函数的地址赋值给成员函数指针,从而调用类的成员函数。

下面是一个使用全局函数和void*指针的例子:

#include 

class MyClass {
public:
    void foo() {
        std::cout << "Hello from foo!";
    }
};

void invoke_function(void* obj_ptr, void (*func_ptr)()) {
    MyClass* p = static_cast(obj_ptr);
    (p->*func_ptr)();
}

int main() {
    void (*func_ptr)() = &MyClass::foo;
    MyClass obj;
    invoke_function(&obj, func_ptr);
    return 0;
}

上面代码中,我们定义了一个全局函数invoke_function,它接受一个void指针和一个函数指针作为参数。在invoke_function函数中,我们将void指针obj_ptr转换为MyClass指针p,并使用成员访问运算符(p->*)和函数指针func_ptr来调用foo函数。在主函数中,我们定义了一个成员函数指针func_ptr,指向MyClass的foo函数。然后,我们创建了一个MyClass对象obj,并将它的地址传递给invoke_function函数,再将func_ptr传递给invoke_function函数。

总结

成员函数指针是一种强大的工具,可以让我们在运行时动态地选择要调用的成员函数。不过,在使用成员函数指针的时候,如果需要指向非成员函数,我们可以使用仿函子或Lambda表达式,或者使用全局函数和void*指针。这些技巧可以帮助我们解决成员函数指针不能指向非成员函数的问题。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

131

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

54

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

85

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

43

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

11

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

49

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
TypeScript 教程
TypeScript 教程

共19课时 | 2.3万人学习

C# 教程
C# 教程

共94课时 | 7万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号