C++ cli 中 const 对象的相等运算符、Equals、GetHashCode
Equality operator, Equals, GetHashCode for const objects in C++ cli
我在 C++ cli 中创建了一个新的托管引用 class。现在我想重载这个 class.
对象的相等性
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
}
在上面的代码片段中,无法在 const
对象上调用 Equals
和 GetHashCode
,这就是我无法从 operator==
调用 Equals
的原因。
如何在 C++ cli 中标记不更改对象的方法?或者最恰当的定义平等链的方式是什么?
这里有两件事:
- .Net 并不像 C++ 那样真正具有
const
的概念。 C++/CLI 将强制执行 C++ 的规则,但由于 .Net 不使用它,因此没有声明任何库方法 const
,因此您在调用任何方法时都会遇到问题。不像在 C++ 中那样被显式声明,只是按照惯例,像 equals
这样的方法不会修改它们的参数。
- 由于您使用了
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
, which refers to GetHashCode
.
这里要小心,因为不相等的对象可能具有相同的哈希码。
GetHashCode
将需要评估所有内容,然后如果哈希码相等,则 Equals
需要再次评估所有内容 以确保它们'实际上是平等的。不看哈希码可能会更有效,只是逐个字段比较对象,一旦不相等就退出。
我在 C++ cli 中创建了一个新的托管引用 class。现在我想重载这个 class.
对象的相等性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
}
在上面的代码片段中,无法在 const
对象上调用 Equals
和 GetHashCode
,这就是我无法从 operator==
调用 Equals
的原因。
如何在 C++ cli 中标记不更改对象的方法?或者最恰当的定义平等链的方式是什么?
这里有两件事:
- .Net 并不像 C++ 那样真正具有
const
的概念。 C++/CLI 将强制执行 C++ 的规则,但由于 .Net 不使用它,因此没有声明任何库方法const
,因此您在调用任何方法时都会遇到问题。不像在 C++ 中那样被显式声明,只是按照惯例,像equals
这样的方法不会修改它们的参数。 - 由于您使用了
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
, which refers toGetHashCode
.
这里要小心,因为不相等的对象可能具有相同的哈希码。
GetHashCode
将需要评估所有内容,然后如果哈希码相等,则 Equals
需要再次评估所有内容 以确保它们'实际上是平等的。不看哈希码可能会更有效,只是逐个字段比较对象,一旦不相等就退出。