运算符重载比较两个值

时间:2013-12-19 17:55:59

标签: c++ overloading operator-keyword

我正在学习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");
}

然而结果是'不'。并且在重载的bool函数中不调用printf函数。如果我以这种方式初始化对象:

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

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

它有效。但在我的情况下,我只使用第一个示例对象(在我的其他项目中)。所以我的问题是我如何传递对象,它会工作。感谢。

3 个答案:

答案 0 :(得分:4)

您正在比较指针,而不是对象,因此永远不会调用您的运算符。

待办事项

*w1 == *w2

w1->operator==(*w2);

或根本没有动态分配

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

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

另请注意,operator==的签名应为

bool operator==(const W&) const

因为它不会修改任何操作数。

答案 1 :(得分: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;
}

答案 2 :(得分: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 );
}

在你的代码中你比较指针,但必须比较自己的对象。所以正确的语法将是

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