2012-06-08 101 views
2

有沒有辦法通過調用類方法或通過來自對象的調用來判斷類的靜態方法是否被調用?區分類或對象是否調用C++靜態方法

class mertz 
{ 
    static int x(void) {....} 
    .... 
} 

int main(...) 
{ 
    int c = mertz::x(); 
    mertz  fred; 
    ind d = fred.x(); 
} 

能X告訴c和d在其調用的區別?

謝謝。

回答

5

不是一種可移植的方式,在大多數C++實現中可能都沒有。

靜態方法實際上只是一個有趣名稱的全局函數。你可以在理論上檢查調用堆棧從那裏呼叫從會找上門來......然而,將被編譯器產生的機器指令很可能將是這兩個

mertx::x(); 

fred.x(); 
相同

,因爲只有實例的靜態類型才能找到要調用的方法,並且此信息在編譯時可用。因此,在這兩種情況下,呼叫代碼都會調用該函數,而無需引用fred實例。

+1

「一個有趣的名字的全球功能」+1! –

6

不,沒辦法區分。這兩個電話是相同的。

出於好奇,是否有任何理由試圖做到這一點?

希望這會有所幫助!

+0

我有一個向量,其節點都是Mertz類型的所有對象。我想要一個靜態的print()方法,它告訴我這個矢量是誰,並且認爲如果Fred要求print()或者如果Mertz詢問,可以跳過突出顯示,那麼讓當前的Mwertz(Fred)很高興。 –

0

你可以同時擁有靜止和具有相同名稱

class mertz 
{ 
    static int x(void) {....} 
    int x(void) {....} 
}; 

否則非靜態函數,如已經指出的那樣,X沒有告訴它如何被調用的機會。

+0

這不適合我 – veio

相關問題