2013-11-01 25 views
4

爲什麼我是否超載 - 在此代碼C++重載 - >,它是如何工作的?

class subobj 
{ 
public: 
    void get() 
    { 
    printf("ea"); 
    } 

}; 

template<typename T> class testPT 
{ 
public: 

    T* operator->() 
    { 
    return ptr; 
    } 


    T* ptr; 
}; 


int main() 
{ 
    subobj myobj; 

    testPT<subobj> myclass; 

    myclass.ptr = &myobj; 



    myclass->get(); 


    return 0; 
} 

>運營商我得到的「EA」串印?

通過使用「myclass->」,應該只返回一個T *,一個指向對象的指針。我應該做類似

MyClass的 - > - >獲得()

實際調用get()函數。我哪裏錯了?

回答

11

operator->是神奇的。 :)

它使用鏈接,這意味着它會被再次調用,只要你不返回一個普通的指針。當您返回一個普通指針時,它會最後致電operator->。當你調用operator->

obj->foo; 

將其翻譯爲:

(obj.operator->())->foo; 

除非obj是一個普通的指針。

你甚至可以這樣做:

template<typename T> class testPT2 
{ 
public: 
    T* operator->() 
    { 
    return ptr; 
    } 
    T* ptr; 
}; 

template<typename T> class testPT 
{ 
public: 
    testPT2<T> operator->() 
    { 
    testPT2<T> p2; 
    p2.ptr = ptr; 
    return p2; 
    } 
    T* ptr; 
}; 

,它仍然會通過有效運用operator->三次工作。

+2

哦,這太棒了! C++總是令我驚喜! –

+0

魔法+1。 :-) – bstamour