重载运算符==

Overloading operator==

本文关键字:运算符 重载      更新时间:2023-10-16

伙计们,我有一些愚蠢的结构,让我们称之为X,我还有一个fnc(不是它的成员(,它返回一个指向这个结构的指针,所以看起来是这样的:

    struct  X
    {
bool operator==(const X* right)
{
//...
}
};
X* get(X* another)
{
//...
}

我在代码中也有一行"试图"比较指向这些结构的指针,但真正的意图是比较指向的结构:

if (get(a) == get(b))//here obviously I have two pointers returned to be compared
{
//...
}

我还定义了X operator==(const X* right)的成员,它假设在上述情况下工作,但由于我不理解的原因,它不工作。如何使其工作(我不能更改行if (get(a) == get(b)),而且get必须返回指针(。

您不能更改比较指针的方式。必须更改if语句的语法,或者更改get()以返回引用而不是指针。任何其他解决方案都将是相当棘手的。

如果您确实必须遵守这些限制,我建议更改get()以返回某种专门的智能指针来封装您想要的这种不一致的行为,包括过载的operator ->()和过载的operator ==()。不过,我发誓,这真的只是在找麻烦,我认为你最好与任何不允许你改变if()声明的力量作斗争。

这不起作用:您的类型是指针,不能重载内置类型的运算符。因此,首先,您可以通过取消引用进行比较:

T * a, * b;
if (*a == *b) { ... }

接下来,要实现这一点,您必须实现T的运算符:

struct T {
  bool operator==(const T & other) const { ... }
  /* ... */
};

请注意,运算符应该是const,并通过const引用获取右侧参数!

请参阅您的最后一句话:如果您都不能更改get(a) == get(b),您也不能更改get的类型,那么您在比较指针时就陷入了困境。

如果您不能更改行get(a) == get(b),也不能更改get(),那么您想要实现的目标是不可能的。

只有在至少有一个操作数属于用户定义类型(或引用用户定义类型(的情况下,才能定义重载运算符。指向类的指针不满足这一要求,因此您不能定义一个将在比较两个指针时调用的运算符。

bool operator==(const X* right)

将X与X*进行比较。不确定是否有一种方法可以为两个X*声明一个比较器,但我的C++有点生疏,你可能会尝试一下朋友的方法。