10

我有一堂课叫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*

4

5 回答 5

12

除非您将其包装在某种智能指针类中,否则不会,但这会使语义变得奇怪。有什么问题if (*myString == "bar")

于 2010-10-06T09:21:52.113 回答
12

不,那里没有。

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

于 2010-10-06T09:33:25.013 回答
4

我认为你想要的是错误的,因为它掩盖了 C++ 的类型系统。myString 指向aAString而不是 a的指针AString。不要试图隐藏它是一个指针的事实。这是丑陋错误的入口点,如果你在一个团队中编码,其他人只会感到困惑!

于 2010-10-06T09:22:00.163 回答
3

[原来的答案是错误的,因此在下面更正]

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

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

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

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

于 2010-10-06T09:21:15.530 回答
3
 if (myString == "bar")

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

bool operator==(const char* pSetString);
于 2010-10-06T09:22:33.220 回答