9

有类似 Java 的东西equals()吗?比较对象是否相同?

public boolean equals(Object obj) {
    if (obj == null || !(obj instanceof ViewMode)) {
        return false;
    }

    ViewMode dm = (ViewMode) obj;
    return dm.width == w
        && dm.h == h
        && dm.b == b
        && dm.f == f;
}

public int hashCode() {
    return w ^ h ^ f  ^ b ;
}
4

4 回答 4

15

对于您的示例的惯用等效项,您将定义operator==如下:

friend bool operator==(const ViewMode &lhs, const ViewMode &rhs) {
    return (lhs.w == rhs.w) && the rest;
}

friend bool operator!=(const ViewMode &lhs, const ViewMode &rhs) {
    return !(lhs == rhs);
}

在 C++ 中,您通常不会编写函数来允许将ViewMode对象与与ViewMode. 我想如果您真的希望该比较返回 false,而不是拒绝编译,那么您可以添加几个模板运算符(作为自由函数,在类之外):

template <typename T>
bool operator==(const ViewMode &, const T&) {
    return false;
}

template <typename T>
bool operator==(const T &, const ViewMode&) {
    return false;
}

但我真的不推荐它。这个 Java 习语不适用于 C++,因为在 C++ 中你几乎不应该有一个对象,但不知道它的类型。

如果您希望您的 equals 函数是虚拟的,那么最好编写一个equals()虚拟函数,而不是使用operator==它。您可以将其编写为采用const ViewObject &as 参数,因此不需要任何等效于instanceof检查的方法。这也很好,因为 C++ 没有任何方法可以获取完全未知类型的对象并测试它是否是指定类型的实例。

在 C++ 中你很少需要多态的 equals 函数,但如果你std::unordered_mapunordered_map. 给它一个相等比较函数,它接受两个指针并调用equals一个或另一个,以及一个做一些有意义的事情的哈希函数。

于 2012-06-11T13:43:26.757 回答
13

不,C++ 没有像 Java 这样的全局类型模型。没有任何Object类型可以继承所有其他类型,因此没有equals为所有类定义的方法(如 )。

C++ 提供了一个使用通用比较操作构建类型模型的框架:operator ==. 由您决定在所有类中构建它的所有实现,以便它们正确交互。但是没有与Object.equals.

于 2012-06-11T13:24:32.757 回答
5

你可以operator==在你的类中定义。

于 2012-06-11T13:26:17.533 回答
1

您也许可以为此使用typeid运算符。

于 2012-06-11T13:26:57.117 回答