2013-01-14 56 views
0

我有lasse1的一個實例,我想在lasse2的方法來使用它,這種方法是靜態方法,這是行不通的:如何在C++中的靜態方法中使用非靜態實例?

class Lasse2{ 
...... 
public : 
static void function(void); 
Lasse1* obj; 
........ 
}; 

,現在我想用它喜歡:

void Lasse2::function(void){ 
obj->dosmt(); // this doesn't work 
......... 

任何想法我該如何解決這個問題?

+12

你不能。這就是_static_的意思。 – SLaks

+1

你的意思是'obj'也是靜態的嗎? –

+0

必須..抗拒...不能... *爲什麼*你*需要*做到這一點? – WhozCraig

回答

2

如果你想訪問你的類的實例成員,那麼你必須有一個實例接受它那個班。這是沒有辦法的。您的選擇是:

  1. 使obj成爲靜態成員。如果您打算爲此類的所有實例使用單個對象,請執行此操作。
  2. 從函數()中移除靜態,使其成爲實例方法。

如果你不能做任何一個,那麼你需要找到一種方法來傳遞一個實例指針到你的函數。例如,需要函數指針的API通常具有一種機制,可以在最終調用指針大小的數據時將該數據傳遞給該函數。

1

更改您的靜態方法來明確地傳遞對象指針:

static void function(Lasse1* obj) 
{ 
    obj->dosmt(); 
} 

但在此之前,考慮一下你真正想要做的(如果你喜歡甚至可以編寫一個問題)。

1

你需要你的類的一個實例來關閉它。

創建一個或通過其他手段(函數參數,全局變量,靜態變量等)

0

SLaks說得好:「你不能」

這裏的原因:

當你聲明一個成員變量(不是靜態的,見上面obj),你告訴編譯器,每個對象類型Lassie2包含指向Lassie1的指針。

當你聲明一個靜態方法時,這意味着它獨立於該類的所有實例(實際對象)。它不在對象上運行。

所以Lasse2::function裏面,有沒有this,沒有Lassie2對象,你得到從obj指針。

相關問題