如何重载指向类的指针的operator==()?

问题描述 投票:0回答:5

我有一个名为

AString
的课程。这是非常基本的:

class AString
{
public:
    AString(const char *pSetString = NULL);
    ~AString();
    bool operator==(const AString &pSetString);
    ...

protected:
    char *pData;
    int   iDataSize;
}

现在我想编写这样的代码:

AString *myString = new AString("foo");
if (myString == "bar") {
    /* and so on... */
}

但是现有的比较运算符仅支持

if (*myString == "bar")

如果我省略那个星号,编译器会不高兴。

有没有办法让比较运算符将

*AString
const char*
进行比较?

c++ pointers operator-overloading comparison-operators
5个回答
12
投票

不,没有。

要重载

operator==
,您必须提供用户定义类型作为操作数之一,并且指针(
AString*
const char*
)不符合条件。
并且在比较两个指针时,编译器有一个非常足够的内置
operator==
,因此它不会考虑将其中一个参数转换为类类型。


12
投票

除非你将它包装在某种智能指针类中,否则不会,但这会使语义变得奇怪。

if (*myString == "bar")
有什么问题吗?


4
投票

我认为你想要的是错误的,因为它掩盖了 C++ 的类型系统。

myString
指向AString
指针
,而不是
AString
。不要试图隐藏它是一个指针的事实。这是丑陋错误的入口点,如果您在团队中编码,其他人只会感到困惑!


3
投票
 if (myString == "bar")

即使你让它发挥作用,对其他人来说也是非常混乱的。您正在将指向对象的指针与字符串文字进行比较。实现此功能的一种更清晰的方法是取消引用指针,并提供类似的重载

bool operator==(const char* pSetString);

3
投票

[原答案有误,已更正如下]

正如 Oli Charlesworth 在下面的评论中指出的,这是不可能的。

您需要定义一个运算符,例如

bool operator==(const AString *as, const char *cs); // Note: C++ will not do that

但是不能重载运算符,除非其参数之一是非原始类型 - 并且指针(指向 AString 的指针和指向 char 的指针)都是原始类型。

© www.soinside.com 2019 - 2024. All rights reserved.