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

使用純C函數指針調用C++的類成員函數

編輯:C++入門知識

出發點:之前偶然碰見一個需要使用C代碼調用C++的成員函數的場景,當時在google上沒有找到解決方案,於是記錄下了這個需求,今天看了GECKO的NPAPI代碼,找到一種方式

原理:類的static成員是作為共享的方式被發布給外層的,所以不具有成員函數地址,所以它可以用來為我們轉彎的調用類的成員函數提供一個機會。
在static成員函數中傳遞類本身的指針,就可以在內部調用這個指針的具體動作。

這解決了C的函數指針不能調用C++的類成員函數的困擾。


以下是一個實例:

#include <iostream>

class C;

struct test{
    char (*a)(C *);
};

class C{
public:
    static char xxx(C *com_on){
       return com_on->_xxx();
    }
    char _xxx(){
        std::cout<<"hei!       _xxx called"<<std::endl;
        return 'a';
    }
};

int main(){
    test x;
    C hei;
    x.a = hei.xxx;
    x.a(&hei);
    return 0;
}

第二種是使用友元函數,具體原理看待嗎也就明白了,上面的代碼忘記改成void*類型的,我想您能看得懂,如果不明白,下面這個應該足以說清楚


#include <iostream>

class C;

struct test{
    char (*a)(void *);
};
char xxx(void*);

class C{
public:
    friend char xxx(void *com_on);
    char _xxx(){
        std::cout<<"hei!       _xxx called"<<std::endl;
        return 'a';
    }
};
char xxx(void  *com_on){
    return ((C*)com_on)->_xxx();
}
int main(){
    test x;
    C hei;
    x.a = xxx;
    x.a(&hei);
    return 0;
}

作者“天使的白骨”

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