C++cli中const对象的Equality运算符、Equals和GetHashCode



我在C++cli中创建了一个新的托管引用类。现在我想重载这个类的相等对象。

public ref class DerivedFromObject {
    virtual bool Equals(Object^ obj) override;
    virtual int GetHashCode() override;
    static bool operator!= (const DerivedFromObject%, const DerivedFromObject%);
    static bool operator== (const DerivedFromObject%, const DerivedFromObject%);
}

据我从C#中所知,operator!=调用operator==,即调用Equals,即GetHashCode

bool DerivedFromObject::operator==(const DerivedFromObject % a, const DerivedFromObject % b)
{
   a.Equals((Object^)%b); // Error
}

在上面的代码段中,EqualsGetHashCode不能在const对象上调用,这就是为什么我不能从operator==调用Equals

如何在C++cli中标记不更改对象的方法?或者,定义平等链最合适的方式是什么?

这里有两件事:

  • .Net不像C++那样真正具有const的概念。C++/CLI将强制执行C++所具有的规则,但由于.Net不使用它,因此没有任何库方法被声明为const,因此您在调用任何方法时都会遇到问题。equals等方法不修改其参数,而不是像C++中那样显式声明
  • 由于您使用了const%,我认为您试图并行传递const&参数的C++约定。%在用法上更类似于**双指针,而不是&:当方法可以为参数分配值时,可以将事物参数传递为%(或^%用于引用类型),并且该值应该可用于调用方法

以下是我将如何实现的:

public ref class DerivedFromObject : IEquatable<DerivedFromObject> {
    virtual bool Equals(DerivedFromObject^ other);
    virtual bool Equals(Object^ obj) override;
    virtual int GetHashCode() override;
    static bool operator!= (DerivedFromObject^, DerivedFromObject^);
    static bool operator== (DerivedFromObject^, DerivedFromObject^);
}

你说的另一件事:

Equals,即GetHashCode

这里要小心,因为不相等的对象可能具有相同的哈希代码。

GetHashCode需要评估所有内容,然后如果哈希码相等,则Equals需要再次评估所有内容,以确保它们实际上相等。不查看哈希代码,只逐字段比较对象,并在对象不相等时立即退出,这可能会更有效。

最新更新