C++ 重载运算符==
伙计们,我有一些愚蠢的结构,我们称之为X,我还有一个fnc(不是它的成员)返回指向这个结构的指针,所以看起来是这样的: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
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可以吗?我不必使用原始指针,所以我只是在这里猜测。