2013-12-19 2 views
0

Я изучаю функциональность перегрузки оператора в C++, и я столкнулся с проблемой. Вот мой код:Оператор oveloading, сравнивающий два значения от

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) ... 
Смежные вопросы