程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ 友元函數的函數指針

C++ 友元函數的函數指針

編輯:關於C++

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 函數相同的特性是:

  1. 毋須提供一個this指針去激活該函數
  2. 可以訪問類的私有成員

不同之處在於該函數不處於該類的作用域之中!分析如下代碼:

// 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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved