我正在学习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;
它有效。但在我的情况下,我只使用第一个示例对象(在我的其他项目中)。所以我的问题是我如何传递对象,它会工作。感谢。
答案 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 ) ...