C++ 结构指针的运算符重载

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) { ...

我试图使用运算符重载比较两个动态分配的结构指针。据我所知,运算符重载应该使用按引用传递,那么这是否意味着不可能通过重载==运算符来实现此特定目标

目标是在不编辑main()中的代码的情况下打印成功

#包括
结构变量
{
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正在寻找一个“否”