成员函数的指针
讲友元之前先讲普通的成员函数的函数指针
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/C++中的内存占用 C++ Module详解:模块化编程终极指南 深入学习 C++编程,数据结构与算法关系 C++编程入门!五个学习阶段让你从新手...- 周排行
- 月排行
-   Java如何比较日期类型
-   Julia vs Python:哪种编程语言会是...
-   Python与C语言、Java、Nodejs、Golang...
-   智能可穿戴设备的主要测试步骤
-   实时输出源代码!墙裂推荐这个场景化...
-   如何设计 API?看这一篇就够了
-   老代码多=过度耦合=if else?阿里巴...
-   GitLab vs Jenkins:哪个是最好的 CI/CD 工具?
-   谈谈Java中遍历Map的几种方法
-   IEEE计算机协会预测2019年十大顶级技术趋势
-   为什么需要软件详细设计?
-   2024年不容错过的十大开发框架
-   【重磅推荐】34张史上最全IT架构师技...
-   好代码的五个特质