2014-01-08 69 views
0

我正在學習模板和運算符重載。我已經寫了一些代碼,但我很困惑...讓我解釋...C++模板和運算符重載

template <class T> 
class tempType 
{ 
public: 
    T value; 
    bool locked; 

    tempType():locked(false) 
    { 
     value = 0; 
    } 

    T operator=(T val) 
    { 
     value=val; 
     return value; 
    } 
    tempType<T> operator=(tempType<T> &val) 
    { 
     value=val.value; 
     return *this; 
    } 
    operator T() 
    { 
     return value; 
    } 
}; 

我沒有...

int main(void) 
{ 
    tempType<int> i; 
    tempType<bool> b; 
    tempType<float> f; 
    i.value = 10; 
    i = i + f; 
    return 0; 
} 

我需要什麼樣的代碼,以執行

tempType<T> operator=(tempType<T> &val){} 

另外,爲什麼operator T()是必需的?

+0

該參數應該是'const'。 – WhozCraig

+0

不確定是否是這樣,但是要覆蓋默認的'operator =',您應該將其定義爲'tempType operator =(const tempType &val){}'。現在你需要通過'i.operator =(other_i)'顯式調用方法。 – luk32

回答

1
template <class T> 
class tempType 
{ 
public: 
    T value; 
    bool locked; 

    tempType() : value(), locked(false) 
    { 
     value = 0; 
    } 

    //althought legal, returning something different from tempType& 
    //from an operator= is bad practice 
    T operator=(T val) 
    { 
     value=val; 
     return value; 
    } 
    tempType& operator=(const tempType &val) 
    { 
     value=val.value; 
     return *this; 
    } 
    operator T() 
    { 
     return value; 
    } 
}; 

int main(void) 
{ 
    tempType<int> a; 
    tempType<int> b; 
    a = b; 
    return 0; 
} 

在代碼中,a = b調用操作符。

至於第二個問題,「默認」不需要operator T()

  1. i被轉換爲int
  2. f被轉換爲浮動
  3. 操作(+)進行
  4. T tempType<int>::operator=(T val)被調用:在你的示例中,當編寫i+f它是用來分配
+0

好的,明白了!謝謝...順便說一下,我編輯答案的操作符T() – StackIT

+0

需要什麼。只要您的類型的對象需要轉換爲T,就可以使用該運算符 –

2

我想我知道所有的答案,所以我不妨發佈完整的回覆。

要覆蓋默認operator=,您應聲明它爲tempType<T> operator=(const tempType<T> &val){}。現在,你需要如果您更正聲明通過i.operator=(other_i).

顯式調用方法,你可以使用它像這樣:

tempType<int> i; 
tempType<int> other_i; 
i = other_i; // this is what you just defined 

operator T()被稱爲conversion operator。它是conversion constructor的一種反轉或計數器部分,在你的情況下它將是tempType(const &T value)

它用於將類對象轉換爲給定類型。所以你的情況你就可以這樣寫:

tempType<int> i; 
int some_int; 
some_int = i; // tempType<int> gets converted into int via `operator int()` 
2

除非你實現移動語義,operator=應始終採取const &參考源值。它也應該返回對修改對象的引用。

tempType & operator=(T const & val) 
{ 
    value=val; 
    return * this; 
} 

operator T是隱式轉換功能,其允許任何​​目的是作爲其底層類型T的對象處理。指定隱式轉換時要小心,它們不會相互衝突。

的隱式轉換函數通常不應該進行復印,所以你可能想

operator T &() 
{ 
    return value; 
} 

operator T const &() const 
{ 
    return value; 
} 

考慮到這些,你不應該需要的operator =另一超載,因爲超載首先將簡單地通過轉換進行調整功能給諸如i = b;的呼叫。

如果一系列的轉換將導致operator=(T const & val)被調用,你應該避免同時定義operator=(tempType const & val)因爲重載將其轉換序列是「更好」,這可能會導致脆性(挑剔)接口的基礎上進行競爭那可能會拒絕做看似合理的事情。