C++ 中是否有相当于 Java equals 方法的方法?

问题描述 投票:0回答:4

有类似 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 ;
}
c++ variables comparison
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 &
作为参数,因此不需要任何与
instanceof
检查等效的内容。这也好,因为 C++ 没有任何方法来获取完全未知类型的对象并测试它是否是指定类型的实例。

在 C++ 中很少需要多态 equals 函数,但如果您在

std::unordered_map
中使用它,那么您需要向
unordered_map
指定额外的模板参数。给它一个相等比较函数,该函数接受两个指针并在其中一个指针上调用
equals
,以及一个执行一些明智操作的哈希函数。


13
投票

不。 C++ 没有像 Java 那样的全局类型模型。不存在可供所有其他类型继承的

Object
类型,因此不存在为所有类定义的方法(如
equals
)。

C++ 提供了一个用于构建具有通用比较操作的类型模型的框架:

operator ==
。您需要在所有类中构建此方法的所有实现,以便它们正确交互。但没有可与
Object.equals
相媲美的默认实现。


5
投票

您可以在班级中定义

operator==


1
投票

您也许可以使用

typeid
运算符来实现此目的。

© www.soinside.com 2019 - 2024. All rights reserved.