2016-03-01 125 views
1

我一直在尋找這一點,並沒有任何運氣。可能是我在尋找錯誤的單詞,或者這可能是一個不尋常的請求(或者根本不可行)。重載類實例變量

不管怎樣,我的問題:我希望能夠使用一個類的實例......嗯,這裏有一個很簡單的例子:

class attribute 
{ 
    float value; 
    float min; 
    float max; 
} 

attribute attr1; 
attr1.value = 5.0f; 

現在,基本上,我想用attR1位彷彿我打電話

attr1.value 

所以,當我說,

std::cout << attr1 << std::endl; 

這將打印5.0(或只是5)。

謝謝!

+0

你存儲''中attr1.value' 5.0f',並想知道你爲什麼把它作爲返回值?真的嗎? –

+0

沒有。再次閱讀。我想知道如何通過使用attr1而不是attr1.value來顯示5(或5.0)。 –

+1

您必須重寫operator << for ostream。你會發現你需要在互聯網上的每一個這個信息 – Garf365

回答

6

您需要通過public實現

std::ostream& operator<<(std::ostream& os, attribute const& att) 
{ 
    os << att.value; 
    return os; // this is how you "chain" `<<` 
} 

無論許可證att.valuefriend船,或者寫一個函數。

另一種方法是建立一個投運營商float

class attribute 
{ 
    public: 
    operator float() const 
    { 
     return value; 
    } 

    private: 
    /*the rest of your class here*/ 

,但這可能導致異常模糊。

最後,如果你想attribute的行爲類似於數字類型,那麼你可以按照你認爲合適的方式重載更多的操作符。例如,超載+=,你可以寫

template<typename Y> 
attribute& operator+=(const Y& p) 
{ 
    value += p; 
    return *this; 
} 
+0

當然。雖然有辦法以這樣一種普遍的方式來實現它嗎?比如......作爲一個參數傳入並將其作爲一個浮點數處理? –

+1

你的意思是一個鑄造操作員'浮動'? (這可能會導致你麻煩)。 – Bathsheba

+0

有點。就這個程序的其餘部分而言,可以把它想象成attr1成爲attr1.value。顯然,attr1是屬性類的一個實例。但我希望它假裝 - 僞裝成,如果你願意的話 - 這是該班級內的「價值」變量。但是,當然,我仍然想把它看作是一個類變量,對於任何不需要它作爲浮點數的東西來說。 –