2013-03-10 68 views
0

我有一個帶有成員和稱爲push的函數的堆棧類。C++這個指針,函數調用中的隱藏參數

class STACK 
{ 
    int data; 
    public: 
    void push(int x) 
    { 
     data=x; 
    } 
} 

是什麼c + +做此發言轉換:

s1.push(3); 

s1.push(this,3); 

基本上我的問題是引擎蓋下會發生什麼,生成this指針,並把它作爲一個隱藏的論點?

我實際上是在編碼C.我的目標是有一個儘可能接近OOP的程序。爲此我有函數指針作爲結構的成員。因此,我想知道是否有可能以某種方式跟蹤哪個結構稱爲函數(如「this」指針)。我不想做這樣的事情:s1.push(& s1,3);因爲它擊敗了我的目的。

是否有可能轉換s1.push(3);到s1.push(& 1,3);經由宏替換

回答

0
this = &s1 

S1的地址是已知的,所以它可以被傳遞到STACK ::推。就這麼簡單:)

+0

我完全同意。但是這行代碼是s1.push(3);它如何變成s1.push(this,3); – 2013-03-10 12:38:07

+2

男人,編譯器不是一個hello世界程序。 「但是代碼行是s1.push(3)」不是一個參數。編譯器執行比傳遞隱藏參數要困難得多的任務。 – cubuspl42 2013-03-10 12:39:44

+0

@DarshanShah:與代碼'int main(){}'變成文件系統中的可執行文件一樣:因爲編譯器*就是這樣做的。 – jalf 2013-03-10 14:04:35

3

有沒有神奇的

s1.push(3); 

STACK::push(&s1, 3); 
+0

那麼,這裏的「魔術」就是'push(...)'成爲一個具有附加'STACK *'參數的普通(即C型)函數。爲了避免與其他普通函數發生名稱衝突,在內部名稱是「mangled」以包含類名稱以及其他內容。 – TaZ 2013-03-10 12:42:53

+1

......當方法變得虛擬時,事情會變得複雜一些;) – cubuspl42 2013-03-10 12:45:49

+1

問題在於關於這一點的神奇,而且對此沒有任何魔力,它只是使用的對象的地址。我知道做STACK :: push的* magic *是正確的。 – Thomas 2013-03-10 12:56:29

0

C++只是語法沒有確切轉換語句(因爲C++是一種語言規範,你可以實現一個語言在很多方面都是如此,即使是在紙上寫作的奴隸羣體也是如此 - 即使你需要計算機,也不需要C++)。編譯器(例如GCC)將該語句翻譯爲其他一些較低級別的表示。使用GCC,它是Gimple語句,並且可以檢查Gimple表示。與MELT's probe-fdump-tree-gimple和其他選項(如-fdump-tree-all-fdump-tree-ssa等...)

5

第一件事第一!聲明:

s1.push(3); 

未轉換爲:

s1.push(this, 3); 

但對這樣的事情:

STACK::push(&s1, 3); 

STACK::push可以在類被視爲全球/命名空間或靜態函數/命名空間STACK,其原型爲:

push(STACK const* pThis, int arg); 

this指針總是方法(函數)的第一個參數。如果方法有零參數,它仍然有一個參數(類的指針this)。

+0

是否有可能通過編碼實現?(我的意思是明確轉換爲推(STACK const * pThis,int arg);) – 2013-03-10 12:46:20

+0

顯而易見的問題是WHY 。你爲什麼想這麼做?可能是你可以寫一個全局函數或者靜態函數並且傳遞類的指針。 – Ajay 2013-03-10 12:47:15

+0

是的。但是那麼你可能只需要編寫代碼C. – TaZ 2013-03-10 12:47:30

0

不幸的是,您必須在C中明確或隱式地指定指針。

對於C++,編譯器有責任將隱式this指針設置爲類成員函數的參數。在你的代碼中,成員函數在編譯時自動編譯爲void STACK::push(STACK*, int),然後,當調用成員函數STACK::push時,編譯器會將對象地址(this)設置爲一個參數(通常是第一個參數)給成員功能STACK::push

沒有C編譯器會提供上述功能,因此,用戶有責任設置指針。

0

編輯完成後,該問題會引發另一個問題 - C中的OOP。這很困難且類型不安全,但可以實現。你可以看看GObject庫,它提供了C語言中的對象系統。我想它會大量使用宏。