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 等式运算符,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 我如何标记不改

据我所知,从C#,
操作符=
调用
操作符==
,该操作符调用
等于
,它引用
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
需要再次计算所有内容,以确保它们实际上相等。不查看散列码可能会更有效,只需逐个字段比较对象,并在对象不相等时立即退出即可