【问题标题】:How to overload operator==() for a pointer to the class?如何为指向类的指针重载 operator==()?
【发布时间】:2010-10-06 09:15:34
【问题描述】:

我有一个名为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* 进行比较?

【问题讨论】:

  • 这个问题之前已经提出过:Here
  • 为什么要动态分配myString?为什么operator== 不是const 成员?或者更好的是,为什么它是会员?或者更好的是,你为什么要编写自己的字符串类?
  • (1) 我不应该。那是一个错误。 (2) 你能详细说明一下吗? (3) 为什么不成为会员? (4) 因为目标平台是嵌入式系统,没有原生的字符串类。
  • 2.如果您不将其设为 const,那么它将不适用于 const AString:s, 3。因为它不需要成为成员并且会导致更好的封装,4,您是什么意思没有“本机字符串类”?你有 std::string。
  • 我不明白 (3)。您是否建议 operator==() 成为好友功能?为什么封装更好?

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


【解决方案1】:

不,没有。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:
         if (myString == "bar")
        

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

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

        【讨论】:

          【解决方案5】:

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

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

          你需要定义一个类似的操作符

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

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

          【讨论】:

          • 但是在之后比较指针时这样做可能会导致进一步的惊喜!
          • 您不能重载运算符,除非其中一个是非原始类型。
          • ...应该说“非会员运营商”。
          • 嗯,成员运算符有一个隐式参数this 指向非原始类型,所以我会说这适用于所有运算符。
          猜你喜欢
          • 1970-01-01
          • 2018-12-26
          • 2014-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-29
          相关资源
          最近更新 更多