2011-08-02 63 views
12

在Java中,您可以簡單地使用return this來獲取當前對象。你如何在C++中做到這一點?在C++中返回「this」?

的Java:

class MyClass { 

    MyClass example() { 
     return this; 
    } 
} 
+2

也許你應該使用測試(幾乎)相同的代碼,看看結果如何?而且,你的方法在上面的代碼中是一個無效方法,所以你可能不想返回任何東西。 –

回答

27

那麼,首先,你不能從void返回任何東西 - 返回功能。

有三種方法可以返回提供對當前對象的訪問權限的方法:通過指針,引用和值。

class myclass { 
public: 
    // Return by pointer needs const and non-const versions 
     myclass* ReturnPointerToCurrentObject()  { return this; } 
    const myclass* ReturnPointerToCurrentObject() const { return this; } 

    // Return by reference needs const and non-const versions 
     myclass& ReturnReferenceToCurrentObject()  { return *this; } 
    const myclass& ReturnReferenceToCurrentObject() const { return *this; } 

    // Return by value only needs one version. 
    myclass ReturnCopyOfCurrentObject() const { return *this; } 
}; 

如上所述,三種方式中的每一種都以稍微不同的形式返回當前對象。你使用哪一種取決於你需要哪種形式。

+3

不要忘記const版本。 –

+3

嗨,我在哪裏可以閱讀'需要const而不是const版本'。我無法理解這一點。如果方法改變不是類成員,我編寫const版本,否則 - 寫入不是const。爲什麼需要我兩個? –

0

,因爲返回類型爲void,即:你宣佈,你不返回任何東西。將其更改爲myclass*以返回this更改爲myclass &以通過*this返回對該類的引用。

6

通過引用返回類別的主要優點之一是能夠輕鬆鏈接函數。

假設你的成員函數是乘以你的類的特定成員。 如果你的頭文件和源文件的格式,以保持之類的信息和成員函數的定義不同,則: 頭文件myclass.h

#ifndef myclass_h 
#define myclass_h 
class myclass{ 
    public: 
    int member1_; 
    double member2_; 

    myclass(){ 
     member1_ =1; 
     member2_ = 2.0; 
    }  

    myclass& MULT(int scalar); 
    myclass* MULTP(double scalar); 
} 
#endif 

源文件:myclass.cpp

myclass& myclass::MULT(int scalar){ 
     member1_ *= scalar; 
     return *this; 
} 
myclass* myclass::MULTP(double scalar){ 
     member2_ *= scalar; 
     return this; 
} 

如果初始化使用上面的默認構造函數稱爲 類的對象,設置member1_等於1: 然後在你的主要功能,你可以做連鎖店,如:

myclass class; 
class.MULT(2).MULT(4); 

然後member1_現在是8.當然,這個想法可能是鏈接不同的功能, 和改變不同的成員。

在您使用的是由指針返回的情況下,第一次調用使用對象, 任何後續調用將把先前的結果爲指針,從而

class.MULTP(2.0)->MULTP(3.0);