1

我目前正在实现 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 比较不​​同于两个复杂对象的比较,甚至不同于双重比较)。后来(在程序中)我不想知道我现在在看什么样的子标签,我只想知道它们是否相等。

4

2 回答 2

1

这个:

l1 == l2

正在比较指针。l1如果和的地址相同,这将是正确的l2

这个

l1->isEqual(l2)

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

于 2013-06-25T06:34:28.250 回答
1

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

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

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

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

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

这是我的旧答案

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

要致电您的运营商,您应该输入:

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

但是不推荐您定义运算符的方式。例如,您应该定义:

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

并打电话

cout << (*l1 == *l2) << endl;
于 2013-06-25T06:35:13.647 回答