C++ cli 等式运算符,Equals,C++;cli 我在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#,C++ cli 等式运算符,Equals,C++;cli 我在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++-cli,equality,C++ Cli,Equality,据我所知,从C#,操作符=调用操作符==,该操作符调用等于,它引用GetHashCode bool DerivedFromObject::operator==(const DerivedFromObject % a, const DerivedFromObject % b) { a.Equals((Object^)%b); // Error } 在上面的代码段中,Equals和GetHashCode不能在const对象上调用,这就是为什么我不能从操作符==调用Equals 我如何标记不改
操作符=
调用操作符==
,该操作符调用等于
,它引用GetHashCode
bool DerivedFromObject::operator==(const DerivedFromObject % a, const DerivedFromObject % b)
{
a.Equals((Object^)%b); // Error
}
在上面的代码段中,Equals
和GetHashCode
不能在const
对象上调用,这就是为什么我不能从操作符==
调用Equals
<>我如何标记不改变C++ CLI中对象的方法?或者什么是定义平等链最合适的方式?这里有两件事:
-
在C++中,NET没有真正的“代码> const <代码>的概念。C++和CLI将强制C++所具有的规则,但是由于.NET不使用它,所以没有声明库方法“代码> CONST ”,因此调用任何方法都会遇到问题。不是像C++那样明确声明,只是按照惯例,像<代码>等于< /代码>的方法不修改它们的参数。<李>
- 由于使用了
const %,我认为您正在尝试并行C++传递规则<代码> const和< /Cord>参数>。code>%在用法上更类似于
双指针,而不是***
:当方法可以为参数赋值时,您可以将对象参数作为&
(或%
传递给引用类型),并且它应该对调用方法可用李>^%
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^);
}
public ref类派生自Object:IEquatable{
虚拟布尔等于(派生自对象^other);
虚拟布尔等于(对象^obj)覆盖;
虚拟int GetHashCode()覆盖;
静态布尔运算符!=(DerivedFromObject^,DerivedFromObject^);
静态布尔运算符==(DerivedFromObject^,DerivedFromObject^);
}
你还说了一件事:
…等于
,它指的是GetHashCode
bool DerivedFromObject::operator==(const DerivedFromObject % a, const DerivedFromObject % b)
{
a.Equals((Object^)%b); // Error
}
这里要小心,因为不相等的对象可能具有相同的哈希代码
GetHashCode
将需要计算所有内容,然后如果哈希代码相等,则Equals
需要再次计算所有内容,以确保它们实际上相等。不查看散列码可能会更有效,只需逐个字段比较对象,并在对象不相等时立即退出即可