我试图使用运算符重载来比较两个动态分配的struct指针。根据我的理解,运算符重载应该是通过引用传递的,所以这是否意味着重载==运算符以实现这个特定的目标是不可能的?
目标是在不编辑main()
中的代码的情况下打印出Success#include <iostream>
struct VAR
{
int x;
VAR()
{
x = 0;
}
VAR(int val)
{
x = val;
}
bool operator==(VAR &lhs)
{
std::cout << "operator called\n";
return (x == lhs.x);
}
bool operator==(VAR *lhs)
{
std::cout << "ptr operator called\n";
return (x == lhs->x);
}
};
int main()
{
VAR *v1 = new VAR(5);
VAR *v2 = new VAR(5);
if (v1 == v2)
std::cout << "Success\n";
else
std::cout << "Fail\n";
delete v1;
delete v2;
v1 = nullptr;
v2 = nullptr;
system("pause");
return 0;
}
答案 0 :(得分:2)
考虑以下代码,几乎与您的代码相同但没有指针:
VAR v1(5);
VAR v2(5);
if (v1 == v2) { ... }
该条件实际上由编译器处理为
if (v1.operator==(v2)) { ... }
当您将v1
转换为指针时,编译器不会自动取消引用指针,即它不会
v1->operator==(v2)
简单的解决方案是自己取消引用指针:
*v1 == *v2
答案 1 :(得分:2)
要完成其他答案,这里是C ++标准的一部分,它明确禁止使用两个指针进行运算符重载(强调我的):
运算符函数应该是非静态成员函数或 是一个非成员函数,至少有一个类型为的参数 类,对类的引用,枚举或对引用的引用 枚举。无法更改优先级,分组或 运营商的操作数。运营商的意义 =,(一元)&amp;和,为每种类型预定义的(逗号),可以通过定义运算符来更改特定的类和枚举类型 实现这些运算符的函数。操作员功能是 以与其他基类函数相同的方式继承。
这解释了为什么在不更改operator==
功能中的代码的情况下,您无法使用重载的main
。
答案 2 :(得分:1)
==运算符的常见实现是
bool operator==(const VAR & lhs)
即使您为VAR对象分配了一个点,也可以使用*运算符“调用”==运算符。
VAR *v1 = new VAR(5);
VAR *v2 = new VAR(5);
if (*v1 == *v2)
std::cout << "Success\n";
else
std::cout << "Fail\n";
答案 3 :(得分:1)
你的==
比较了两个指针。指针是原始类型,,无论它们指向什么,you cannot overload operators when all operands are of primitive types。
换句话说:如果左操作数是VAR
而不是VAR*
,则重载的运算符会起作用。
当然,您的代码无论如何都不能成为使用指针或动态内存分配的令人信服的点。只需删除所有内容:
int main()
{
VAR v1(5);
VAR v2(5);
if (v1 == v2)
std::cout << "Success\n";
else
std::cout << "Fail\n";
}
这样,您也不再需要第二个操作符。为了完整起见,您可以像这样调用它:
int main()
{
VAR v1(5);
VAR v2(5);
if (v1 == &v2)
std::cout << "Success\n";
else
std::cout << "Fail\n";
}
答案 4 :(得分:-1)
#include <iostream>
struct VAR
{
int x;
VAR()
{
x = 0;
}
VAR(int val)
{
x = val;
}
bool operator==(VAR &lhs)
{
std::cout << "operator called\n";
return (x == lhs.x);
}
bool operator==(VAR *lhs)
{
std::cout << "ptr operator called\n";
return (x == lhs->x);
}
};
int main()
{
VAR *v1 = new VAR(5);
VAR *v2 = new VAR(5);
if (v1->operator==(v2))
std::cout << "Success\n";
else
std::cout << "Fail\n";
delete v1;
delete v2;
v1 = nullptr;
v2 = nullptr;
return 0;
}