2013-12-19 44 views
0

的兩個值我正在學習C++中的運算符重載功能,並且遇到了一個問題。這裏是我的代碼:運算符開發比較來自

template <typename T> 
class W 
{ 
public: 

    bool operator==(W&); 
    T x; 
}; 


template <typename T> 
bool W<T>::operator==(W& w2) 
{ 
    printf("\n%d, %d\n", x, w2.x); 
    if(x == w2.x) return true; 
    else return false; 
} 

int main() 
{ 
    W<int>* w1 = new W<int>; 
    W<int>* w2 = new W<int>; 

    w1->x = 10; 
    w2->x = 10; 

    if(w1 == w2) printf("same"); 
    else printf("not"); 
} 

結果是'不'。並且printf函數在重載的bool函數中未被調用。如果我以這種方式初始化對象:

W<int> w1; 
W<int> w2; 

w1.x = 10; 
w2.x = 10; 

它的工作原理。但在我的情況下,我只使用第一個示例對象(在我的其他項目中)。所以我的問題是我如何傳遞對象,它會工作。謝謝。

回答

4

你在比較指針而不是對象,所以你的操作符永遠不會被調用。

*w1 == *w2 

w1->operator==(*w2); 

或根本

W<int> w1; 
W<int> w2; 

w1.x = 10; 
w2.x = 10; 

沒有動態分配另請注意,operator==簽名應該是

bool operator==(const W&) const 

因爲它修改了兩個操作數。

2

您沒有比較代碼中的對象,而是比較對象(指針)的地址。有沒有必要進行動態分配這些對象:

int main() 
{ 
    W<int> w1; 
    W<int> w2; 

    w1.x = 10; 
    w2.x = 10; 

    if(w1 == w2) 
     printf("same"); 
    else 
     printf("not"); 
} 

此外,您可以從您的重載操作更改返回值:

template <typename T> 
bool W<T>::operator==(const W& w2) const // note: it should be declared as const 
{ 
    printf("\n%d, %d\n", x, w2.x); 
    return x == w2.x; 
} 
0

你的運營商的定義是不好的。更好的聲明可能如下EAY

bool operator==(const W &) const; 

和相應的實現

template <typename T> 
bool W<T>::operator ==(const W &w2) const 
{ 
    printf("\n%d, %d\n", x, w2.x); 
    return (x == w2.x); 
} 

在你的代碼比較指針,但必須theirself比較的對象。所以正確的語法將是

if (*w1 == *w2) ...