Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载运算符==_C++_Operator Overloading - Fatal编程技术网

C++ 重载运算符==

C++ 重载运算符==,c++,operator-overloading,C++,Operator Overloading,伙计们,我有一些愚蠢的结构,我们称之为X,我还有一个fnc(不是它的成员)返回指向这个结构的指针,所以看起来是这样的: struct X { bool operator==(const X* right) { //... } }; X* get(X* another) { //... } 我还有一行代码“尝试”将指针与这些结构进行比较,但真正的目的是比较指向的结构: if (get(a) == get(b))//here obviously I have two point

伙计们,我有一些愚蠢的结构,我们称之为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)
的成员,该成员假定在上述情况下工作,但由于我不理解的原因,它不工作。如何使其工作(如果(get(a)==get(b))并且
get
必须返回指针,则无法更改行

您无法更改指针的比较方式。必须更改
if
语句的语法,或者更改
get()
以返回引用而不是指针。任何其他的解决方案都会非常困难

如果您确实必须遵守这些限制,我建议更改
get()
以返回某种专门的智能指针,用重载的
运算符->()
和重载的
运算符==()
封装您想要的不一致行为。不过我发誓,这真的只是自找麻烦,我认为你最好还是与任何权力不允许你改变
if()
语句的情况作斗争

bool operator==(const X* right)

将X与X*进行比较。不确定有一种方法可以为X*声明比较器,但是我的C++有点生锈,你可以给朋友一个方法。< /P> < P>这是不起作用的:你的类型是指针,并且你不能为内置类型的操作符超载。首先,通过解引用进行比较:

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()
那么你想要达到的目标是不可能的


重载运算符只能在至少一个操作数为用户定义类型(或对用户定义类型的引用)的情况下定义。指向类的指针不符合该要求,因此您无法定义一个运算符,在比较两个指针时将调用该运算符。

无法完成。运算符重载必须具有用户定义的类型作为操作数之一。如果需要执行
get(a)==get(b)
,并且返回指针需要执行
get()
,则两个操作数都是指针,即不是用户定义的类型<代码>操作符==(const X*right)
如果你能做到
*get(a)==get(b)
,那就行了,但是你不能。为什么你不能改变那行代码?你能解释一下为什么你有这些愚蠢的要求吗?请注意,你实际上是在问,“我想让这行
1==2
有时返回真的”,除了你问它的是指针而不是整数。不,内置比较不能更改,指针比较是内置的。@Steve Jessop谢谢,我确实理解这一点,但我想如果这种行为可以更改,现在我知道它不能更改。又一个教训。谢谢大家的帮助。@104您认为unique_ptr可以吗?我不必使用原始指针,所以我只是在这里猜测。