C++ 结构指针的运算符重载
我试图使用运算符重载比较两个动态分配的结构指针。据我所知,运算符重载应该使用按引用传递,那么这是否意味着不可能通过重载==运算符来实现此特定目标 目标是在不编辑main()中的代码的情况下打印成功C++ 结构指针的运算符重载,c++,pointers,struct,operator-overloading,C++,Pointers,Struct,Operator Overloading,我试图使用运算符重载比较两个动态分配的结构指针。据我所知,运算符重载应该使用按引用传递,那么这是否意味着不可能通过重载==运算符来实现此特定目标 目标是在不编辑main()中的代码的情况下打印成功 #包括 结构变量 { int x; VAR() { x=0; } VAR(int-val) { x=val; } 布尔运算符==(变量和lhs) { std::cout考虑以下代码,与您的代码几乎相同,但没有指针: VAR v1(5); VAR v2(5); if (v1 == v2) { ...
#包括
结构变量
{
int x;
VAR()
{
x=0;
}
VAR(int-val)
{
x=val;
}
布尔运算符==(变量和lhs)
{
std::cout考虑以下代码,与您的代码几乎相同,但没有指针:
VAR v1(5);
VAR v2(5);
if (v1 == v2) { ... }
该条件实际上由编译器按如下方式处理:
if (v1.operator==(v2)) { ... }
当您将v1
转换为指针时,编译器不会自动取消对指针的引用,即它不会
v1->operator==(v2)
简单的解决方案是自己去引用指针:
*v1 == *v2
考虑以下代码,与您的代码几乎相同,但没有指针:
VAR v1(5);
VAR v2(5);
if (v1 == v2) { ... }
该条件实际上由编译器按如下方式处理:
if (v1.operator==(v2)) { ... }
当您将v1
转换为指针时,编译器不会自动取消对指针的引用,即它不会
v1->operator==(v2)
简单的解决方案是自己去引用指针:
*v1 == *v2
==运算符的常见实现是
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";
VAR*v1=新的VAR(5);
VAR*v2=新的VAR(5);
如果(*v1==*v2)
==运算符的常见实现是
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";
VAR*v1=新的VAR(5);
VAR*v2=新的VAR(5);
如果(*v1==*v2)
std::cout您的==
比较两个指针。指针是基本类型,,无论它们指向什么,,和
换句话说:如果左操作数是VAR
而不是VAR*
,则重载运算符可以工作
当然,您的代码对于使用指针或动态内存分配并没有令人信服的意义。只需删除所有这些:
int main()
{
VAR v1(5);
VAR v2(5);
if (v1 == v2)
std::cout << "Success\n";
else
std::cout << "Fail\n";
}
intmain()
{
VAR v1(5);
VAR-v2(5);
如果(v1==v2)
std::cout您的==
比较两个指针。指针是基本类型,,无论它们指向什么,,和
换句话说:如果左操作数是VAR
而不是VAR*
,则重载运算符可以工作
当然,您的代码对于使用指针或动态内存分配并没有令人信服的意义。只需删除所有这些:
int main()
{
VAR v1(5);
VAR v2(5);
if (v1 == v2)
std::cout << "Success\n";
else
std::cout << "Fail\n";
}
intmain()
{
VAR v1(5);
VAR-v2(5);
如果(v1==v2)
std::cout#包括
结构变量
{
int x;
VAR()
{
x=0;
}
VAR(int-val)
{
x=val;
}
布尔运算符==(变量和lhs)
{
std::cout运算符==(v2))
std::cout#包括
结构变量
{
int x;
VAR()
{
x=0;
}
VAR(int-val)
{
x=val;
}
布尔运算符==(变量和lhs)
{
std::cout运算符==(v2))
STD::CUT来完成其他答案,这里是C++标准的一部分,它明确禁止操作符重载两个指针(强调雷):
操作员功能应为非静态成员功能或
是至少有一个类型为的参数的非成员函数
类、对类的引用、枚举或对
枚举。无法更改优先级、分组或属性
运算符的操作数。运算符的含义
为每种类型预定义的=、(一元)和(逗号),可以通过定义运算符为特定类和枚举类型进行更改
实现这些运算符的函数。运算符函数包括
以与其他基类函数相同的方式继承
这解释了为什么不能使用一个重载的<代码>运算符==/COD>不改变你的代码>主< /Cuff>函数.< /p> < p>以完成其他的答案,这里是C++标准的一部分,它明确禁止操作符重载两个指针(强调雷):
操作员功能应为非静态成员功能或
是至少有一个类型为的参数的非成员函数
类、对类的引用、枚举或对
枚举。无法更改优先级、分组或属性
运算符的操作数。运算符的含义
为每种类型预定义的=、(一元)和(逗号),可以通过定义运算符为特定类和枚举类型进行更改
实现这些运算符的函数。运算符函数包括
以与其他基类函数相同的方式继承
这就解释了为什么在不更改main
函数中的代码的情况下,不能使用重载的运算符==
。我想您需要*v1==*v2
来比较内容有没有一种方法可以在不更改main()中的代码的情况下实现这一点?据我所知。v1==v2
比较指针,即它们是否拥有相同的地址。我认为这是无法改变的。即使是这样,我认为这样做也会非常糟糕,因为这会与其他程序员的预期相冲突。@DeepBlackDwarf的可能重复-我认为Evan在寻找一个“不,那是不可能的”回答并解释为什么不可能。我很确定这是不可能的,但我不能给出证明这是不可能的标准的参考。我想你需要*v1==*v2
来比较内容。有没有一种方法可以在不更改main()中的代码的情况下实现这一点?据我所知不是这样。v1==v2
比较指针,即它们是否拥有相同的地址。我认为这是无法改变的。即使是这样,我认为这样做也会非常糟糕,因为这会与其他程序员的预期相冲突。@DeepBlackDwarf的可能重复-我认为Evan正在寻找一个“否”