2012-03-15 115 views
8

有沒有一種方法可以從C++中的主類中包含的另一種方法調用非靜態類成員方法?如果是這樣,代碼將是什麼樣子?從另一種方法調用非靜態成員方法

問題是,我無法將此特定方法聲明爲靜態方法,因爲它使用同一類中的其他方法,如果使其中一個靜態方法不起作用,則該方法不起作用。

我試圖使用方法:

MyClass::myClassMethod(); 

從主類中的方法,但它給我的錯誤:非靜態成員引用必須是相對於特定對象。

爲了澄清,myClassMethod()使用內等MyClass的其他方法:

void myClassMethod() { 
    ... 
    anotherClassMethod(); 
} 

,所以如果我是做myClassMethod靜將與調用anotherClassMethod干擾()。

+0

在閱讀已發佈的答案中的問題和評論之後,獲得關於您正在嘗試做什麼的更多信息仍然很有用。 myClassMethod本身是靜態的嗎?它從哪裏被調用?你能改變方法的參數嗎?你被分配的問題的目標是什麼? – tmpearce 2012-03-15 04:09:20

+0

好像你真的需要想一想你可能想在這裏做什麼樣的行爲。與靜態和非靜態方法的關鍵區別在於後者需要訪問任何一個類的數據,或者可能進行內部完成相同的虛擬調用。如果'myClassMethod'調用非靜態的anotherClassMethod',那麼是否需要這樣做?如果沒有,請將它們設爲靜態。如果是這樣,那麼當該方法嘗試訪問數據時,您希望發生什麼? – Keith 2012-03-15 04:33:24

回答

3

static成員函數調用非靜態成員函數的處理是什麼?

每個非靜態成員函數傳遞this指針隱含除了傳遞的參數,通過了指針,然後解除引用來引用類對象的成員但是static功能不與所述隱式this指針傳遞,因此一個不能調用靜態成員函數內的任何非靜態成員函數,因爲沒有this這樣做。

什麼是解決方案,如果你想這樣做呢?

您將需要一些機制來得到的指針靜態方法裏面的對象,然後就可以調用使用指針的成員函數。
如何做到這一點?
您將不得不全局存儲指向類對象的指針,或者將其作爲實例中的一個函數參數傳遞給靜態方法。

然而,這上面的變通辦法,這裏要注意的重要的事情是,如果你覺得通過調用靜態成員函數的非靜態成員函數的需求,然後有一些錯誤在您的設計。


轉念一想,也許我錯讀之前你的問題,也許,你的問題是:

如何從main調用類的非靜態成員函數?

您需要的類來調用非靜態成員函數的一個實例。
那麼簡單,

MyClass obj; 
obj.myClassMethod(); 

,並呼籲從myClassMethod()內的任何其他成員函數,簡直是:

void myClassMethod() 
{ 
    //... 
    anyOtherMyClassNonStaticMemberFunction(); 
    //... 
} 
+0

對不起,我是新手。我將如何做到這一點? – aclark 2012-03-15 03:07:31

+0

@aclark:請檢查更新的答案,我添加了一些更多的細節。它有道理嗎? – 2012-03-15 03:11:36

+0

感謝您的解釋。問題是,這個設計是由教師給出的,所以我必須使用它。對我來說似乎也相當複雜: -/ – aclark 2012-03-15 03:13:12

3

調用類的非靜態方法的唯一途徑是通過某個實例類。所以你需要類似這樣的東西...

MyClass myClass; 
myClass.myClassMethod(); 
+0

這太棒了。謝謝。 – aclark 2012-03-15 03:13:58

4

靜態方法是不能在任何特定對象上運行的方法。它很像一個類之外的獨立函數,只是它允許訪問類中的私有成員。

如果anotherClassMethod()是非靜態的,那意味着它必須在特定的對象上,一個類的實例上調用。因爲它是在對象上調用的,所以它可以訪問存儲在該對象中的數據(非靜態成員變量)。如果myClassMethod()是靜態的,你實現它作爲

void MyClass::myClassMethod() { 
    anotherClassMethod(); 
} 

這是行不通的,因爲anotherClassMethod()預期特定對象上調用,但myClassMethod()沒有之一。但是,如果你知道你想叫它什麼對象,你可以做到這一點作爲一個普通的方法調用的對象上:

void MyClass::myClassMethod(MyClass &object) { 
    object.anotherClassMethod(); 
} 

object不必傳遞作爲參數;它可能是在類的靜態成員變量,例如:

class MyClass { 
private: 
    static MyClass theInstance; 

    // ... 
}; 

void MyClass::myClassMethod() { 
    theInstance.anotherClassMethod(); 
} 

最後,你需要問自己的問題是:爲什麼是myClassMethod()靜態的,爲什麼anotherClassMethod()非靜態?退一步,想想myClassMethod()應該做什麼。在沒有實例可以使用時調用它是否有意義?如果是這樣,爲什麼需要調用一個期望與實例一起工作的方法?

0

我認爲,也許你可以使用單例模式,保持全局類的一個實例。像公用事業類。

相關問題