成员函数的指针
讲友元之前先讲普通的成员函数的函数指针
class Std_interface {
public:
virtual void suspend() = 0;
};
// define the pointer of function
typedef void (Std_interface::* Pstd_mem) ()
void f(Std_interface* p) {
Pstd_mem s = &Std_interface::suspend;
// call directly
p->suspend();
// by pointer
(p->*s)();
}
当函数指针指向类成员对象时,对函数指针的定义必须加上类名以及::(作用域运算符)标识该函数指针指向哪个类的成员函数。
调用函数指针所指向的类成员函数时,必须提供函数所操作的类对象,类似于成员函数的访问,用这个对象去调用这个函数。
友元函数
那么,如果我们的函数指针已经声明成普通的函数指针,那么有无解决方案?使用友元函数,与static 函数相同的特性是:
毋须提供一个this指针去激活该函数 可以访问类的私有成员
不同之处在于该函数不处于该类的作用域之中!分析如下代码:
// GlAnimator.h
class GlAnimator {
public:
int example();
friend int LoopInThread(GlAnimator *animator_ptr);
};
// GlAnimator.cpp
typedef int(*InnerLoop)(GlAnimator *);
int GlAnimator::example() {
InnerLoop inner_loop = &LoopInThread;
return 0;
}
// friend function
int LoopInThread(GlAnimator *animator_ptr) {
// ...
return 0;
}
InnerLoop inner_loop = &LoopInThread; 处是会报错的,说"LoopInThread undeclared" 这个很有意思了,明明在头文件定义了的!原因是上面提到的其作用域不在该类内,而我偏偏在成员函数example()里面去取其地址,那么显然就是没有声明的了。
解决方案就是重新声明一遍,一共声明两遍,在取函数指针前声明即可,我喜欢在头文件里做,头文件修改如下:
// GlAnimator.h
class GlAnimator {
public:
int example();
friend int LoopInThread(GlAnimator *animator_ptr);
};
// declare the friend function again
int LoopInThread(GlAnimator *animator_ptr);
C++ 友元函数的函数指针
发表于:2017-08-08
作者:网络转载
来源:
 相关文章
指针变量在C/C++中的内存占用 C++ Module详解:模块化编程终极指南 深入学习 C++编程,数据结构与算法关系 C++编程入门!五个学习阶段让你从新手... 掌握C/C++中的静态变量与静态成员! C++函数式编程:提高代码表达力和可维护性- 周排行
- 月排行
- 评论排行
-   高效IT:如何利用零代码开发平台快速...
-   2024年,五个Java开发者应该关注的编程趋势
-   2023 年 Java 发展趋势
-   全面了解HTTP和HTTPS(开发人员必备)
-   Web开发比较:Spring Boot 与 Express.js
-   程序员工作中常用的7款编程语言!用过...
-   软件架构五大原则,确保你的项目100%成功
-   一体化好好的,为什么要前后端分离?
-   2024年最具潜力的十大编程语言:引领...
-   2024年,五个Java开发者应该关注的编程趋势
-   六个好用的在线代码编辑器,你选哪个?
-   智能可穿戴设备的主要测试步骤
-   高效IT:如何利用零代码开发平台快速...
-   五个IntelliJ IDEA插件,高效编写代码
-   从软件出发,非功能测试思考总结
-   展望2017,谁是网络技术头牌?
-   C/C++单元测试工具Visual Unit 4 介绍
-   国内外最好用的6款Bug跟踪管理系统
-   性能测试指标评估必读
-   百度软件测试方案模板
-   38张史上最全的IT工程师技能图谱
-   C/C++单元测试工具Visual Unit 4 介绍
-   2019年,你会选哪些安全测试工具?
-   十款Web服务器性能压力测试工具
-   软件测试入门指南:周期、模型和文档化
-   记自动化测试成神学习之路
-   软件测试全景图 -最全的思维导图