我在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
}
在上面的代码段中,Equals
和GetHashCode
不能在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
需要再次评估所有内容,以确保它们实际上相等。不查看哈希代码,只逐字段比较对象,并在对象不相等时立即退出,这可能会更有效。