1. 程式人生 > >c語言呼叫c++類成員函式的方法

c語言呼叫c++類成員函式的方法

最近做了一個wav格式的音訊播放器,介面部分用Qt實現,中間層程式碼使用C語言實現,這就涉及到c和c++相互呼叫的問題。

c++呼叫c語言的方法在另一篇文章中已經說明,c呼叫c++的方法現做如下介紹。

音訊播放的時候中間層程式碼需要將音訊的播放進度和狀態等資訊反饋給介面程式進行顯示,但是主程式是用c++寫的,通過介面函式呼叫c中間層程式碼進行相應操作並完成相應的功能,因此中間層c程式碼並不能主動將引數反饋給主執行緒,怎麼辦? 通過函式指標實現。

首先,在c程式碼中宣告一個函式指標,和一個以函式指標型別為引數的介面函式。

void (*fset)(int value);
void finit( void (*f)(int value))
{
    fset = f;
}
當c++呼叫此函式時,將需要被c語言呼叫的函式 當作引數傳遞給c並賦值給全域性函式指標,這樣在c中呼叫 fset(int value);就可以實現c++函式的功能。

但是,要想實現c語言修改c++類成員的功能,還需要將此函式宣告為友元

class A{
public:
    A();
   ~A();
  friend void set(int value);
}

A * pa; //宣告一個全域性的A類物件

A::A(){
pa = this;   //在A的建構函式中將this指標傳遞給pa
}

void set(int value){
pa->--------     //通過pa指標修改類成員屬性
}

最後,在Qt圖形介面相應控制元件下 呼叫c語言函式 void finit(void (*f)(int value )) 並把 set()友元函式當作引數傳遞給c語言 

finit(set);

然後再c語言中呼叫 fset(value)  就可以將 value 傳遞給c++程式碼處理

此方法雖然可以實現 c語言修改 c++類成員屬性的功能,但是破壞了類的封裝性,目前只知道在嵌入式產品開發中使用。