C++ 友元函數的函數指針。本站提示廣大學習愛好者:(C++ 友元函數的函數指針)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ 友元函數的函數指針正文
講友元之前先講普通的成員函數的函數指針
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 函數相同的特性是:
不同之處在於該函數不處於該類的作用域之中!分析如下代碼:
// 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);
參考資料
http://www.cplusplus.com/forum/general/23265/
http://hipercomer.blog.51cto.com/4415661/941682