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

时间:2010-10-06 09:15:35

标签: c++ pointers operator-overloading comparison-operators

我有一个名为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")

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

有没有办法让比较运算符将*AStringconst char*进行比较?

5 个答案:

答案 0 :(得分:11)

除非你将它包装在某种智能指针类中,否则会使语义变得奇怪。 if (*myString == "bar")出了什么问题?

答案 1 :(得分:9)

不,没有。

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

答案 2 :(得分:3)

我认为你想要的是错误的,因为它模糊了C ++的类型系统。 myString 指向<{1}}的指针,而不是AString。不要试图隐藏它是指针的事实。这是丑陋的错误的切入点,如果你在一个团队中编码,其他所有人都会感到困惑!

答案 3 :(得分:3)

 if (myString == "bar")

即使你让它上班,也会让别人感到困惑。您正在将指向对象的指针与字符串文字进行比较。让这个工作更清晰的方法是取消引用指针,并提供像

这样的重载
bool operator==(const char* pSetString);

答案 4 :(得分:2)

[原始答案错误,因此在下面更正]

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

您需要定义类似

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

但是你不能重载运算符,除非它的一个参数是非基本类型 - 而指针(指向AString和指向char的指针)都是基本类型。