代码之家  ›  专栏  ›  技术社区  ›  bastibe

如何为指向类的指针重载运算符==()?

  •  7
  • bastibe  · 技术社区  · 14 年前

    我有个班级叫 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* ?

    5 回复  |  直到 14 年前
        1
  •  9
  •   Bart van Ingen Schenau    14 年前

    不,没有。

    超载 operator== 必须提供一个用户定义的类型作为操作数和指针(或 AString* const char*
    当比较两个指针时,编译器有一个非常充分的内置 运算符== ,因此它不会考虑将其中一个参数转换为类类型。

        2
  •  11
  •   Oliver Charlesworth    14 年前

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

        3
  •  3
  •   stijn    14 年前
     if (myString == "bar")
    

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

    bool operator==(const char* pSetString);
    
        4
  •  3
  •   WolfgangP    14 年前

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

        5
  •  2
  •   ndim    14 年前

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

    正如奥利·查尔斯沃思在下面的评论中指出的,这是不可能的。

    你需要定义一个像

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

    但是,除非其中一个参数是非基元类型,并且指针(指向astring的指针和指向char的指针)是基元类型,否则无法重载运算符。