【问题标题】:C++ Operator vs. method overloading and their different behavioursC++ 运算符与方法重载及其不同行为
【发布时间】:2013-06-21 20:28:13
【问题描述】:

我目前正在实现 C++ 中的标签支持类。但是,我对重载运算符和 isEqual 方法的不同行为有点困惑:

class Lbl
{
public:
    virtual bool operator == (const Lbl* l) const = 0;
    virtual bool isEqual (const Lbl* l) const = 0;
};

class SubLbl : public Lbl
{
public:
    SubLbl(){}

    bool operator == (const Lbl* l) const {return true;}
    bool isEqual (const Lbl* l) const {return true;}
};

int main(int argc, char** argv) {
    SubLbl* l1 = new SubLbl();
    SubLbl* l2 = new SubLbl();

    cout << (l1 == l2) << endl;
    cout << (l1->isEqual(l2)) << endl;
    return 0;
}

输出:

0
1

这是为什么?我如何需要更改它以使运算符也重载?为什么我必须继承“public”才能访问“isEqual”方法?或者这只是我到目前为止没有使用(也不知道)的模板的典型情况?

我正在做的是实现不同的 SubLbl 类,以支持我可以放在对象上的不同类型的标签。所有(SubLbl 类)都从 Lbl 类继承,并且由于它们自己的相等定义而应该重载相等运算符(int 比较不​​同于两个复杂对象的比较,甚至不同于双重比较)。后来(在程序中)我不想知道我现在在看什么样的子标签,我只想知道它们是否相等。

【问题讨论】:

    标签: c++ methods overloading operator-keyword


    【解决方案1】:

    这个:

    l1 == l2
    

    正在比较指针。这只有在l1l2 的地址相同时才成立。

    这个

    l1->isEqual(l2)
    

    正在调用返回true的成员函数。

    【讨论】:

    • 值得注意的是*l1 == *l2调用重载的操作符。
    • @AlexShesterov 我不这么认为:操作员期望一个指针,调用 (*l1 == l2) 会做,我不认为这是期望的行为。
    • @Antonio:哦...对...我没有注意到签名中的*(代替通常的&amp;)...
    • @juanchopanza 你是对的:事实上, l1 是一个指针,而不是一个类的对象。通过将命令更改为 'code'(*l1 == l2) 重载工作,因为我现在正在寻址对象,而不是指针。你拯救了这一天!
    【解决方案2】:

    我不得不说,更好地阅读,这是一个非常棘手的答案,因为您正在谈论继承和重载运算符。

    我的猜测是,如果您不知道它们是完全相同的类,则不应将对象与 operator== 进行比较。我认为你应该只在 SubLbl 中定义:

    bool operator == (const SubLbl& l) const {return _something_;}
    

    注意,我将 SubLbl 类型的对象作为参数。而且我会避免在 Lbl 中定义一个虚拟的operator==,尤其是在虚拟的情况下。 另一方面,函数 isEqual 可能没问题。

    您可以在这里找到不同解决方案的灵感:Making operator<< virtual?

    这是我的旧答案

    在第一种情况下,您没有调用您定义的运算符,但您正在检查 2 个指针是否指向同一个对象,或者更好的是,具有相同的值。

    要打电话给你的接线员,你应该输入:

    cout << (*l1 == l2) << endl;
    

    但是你定义操作符的方式是不推荐的。例如,您应该定义:

    bool operator == (const Lbl& l) const {return _something_;}
    

    然后打电话

    cout << (*l1 == *l2) << endl;
    

    【讨论】:

    • 感谢您的回答。实际上,基本运算符 == 函数检查类是否相同,并在后一种情况下返回 false。如果为真,则传递的对象是类型转换的,并调用特定于类型的相等运算符方法(如您所建议的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多