namespace Wrapper
public ref class MyClass : IEquatable<MyClass>
{
// 略
でよいはずですが?
GetHashCodeはそのままC++/CLI に変換するだけです。
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
C++/CLI 自作クラス(IEquatable)の比較方法がわかりません。
<C++/CLI>
namespace Wrapper
{
public ref class MyClass
{
public:
int i1;
int i2;
//コンストラクター
MyClass(int _i1, int _i2) { i1 = _i1; i2 = _i2; }
bool Equals(MyClass^ other) //staticは使用できない (i1,i2が参照できなくなる)
{
int h1;
h1 = i1;
if (i1 == other->i1 && i2 == other->i2) return true;
return false;
}
};
public ref class MyClassComparer : IEquatable<MyClass^>
{
public:
virtual bool Equals(MyClass^ other) override
{
return false;//テスト用
//return MyClass::Equals(other); //MyClassをstaticにするとコンパイルが通る
}
};
}
<VB.net>
Public Class MyVBClass '動作する
Implements System.IEquatable(Of MyVBClass)
Public Property i1 As Integer
Public Property i2 As Integer
Public Sub New(ByVal _i1, ByVal _i2)
i1 = _i1 : i2 = _i2
End Sub
Public Function Equals(other As MyVBClass) As Boolean Implements IEquatable(Of MyVBClass).Equals
If Me.i1 = other.i1 AndAlso Me.i2 = other.i2 Then
Return True
End If
Return False
End Function
Public Overrides Function GetHashCode() As Integer
Dim d1 As Integer = (Me.i1 And &HFFFF) << 16 Or (Me.i2 And &HFFFF)
Return d1
End Function
End Class
使用する側
Dim b2 = New HashSet(Of MyVBClass)
b2.Add(New MyVBClass(6, 17))
b2.Add(New MyVBClass(-1, 16))
b2.Add(New MyVBClass(6, 17))
'↑ ここまでは正常に動作する 結果 (6.17)及び (-1.16)の2要素
Dim b3 = New HashSet(Of Wrapper.MyClass)
'Hashsetのコンストラクターで、ref class MyClassComparer : IEquatable<MyClass^>を
'組み込む方法がわからない
b3.Add(New Wrapper.MyClass(6, 17))
b3.Add(New Wrapper.MyClass(-1, 16))
b3.Add(New Wrapper.MyClass(6, 17))
※質問内容
VB.netで作成したクラスをC++/CLIに移植したいのですが、方法がわかりません。
C++/CLIのソースで、自作クラスにIEquatableを実装しようとしています。
ref class MyClassComparer のvirtual bool Equals メソッドから ref class MyClass 内の
bool Equalsを呼んでいるのですが、return MyClass::Equals(other); とするとコンパイルが通りません。
VB.net側でb3 = New HashSet(Of Wrapper.MyClass) としているのですが、Wrapper.MyClassにはIEquatableが実装されていないので、Equalsメソッドが実行されません。この問題の解決方法もわかりません。
御教授をお願いします。
namespace Wrapper
public ref class MyClass : IEquatable<MyClass>
{
// 略
でよいはずですが?
GetHashCodeはそのままC++/CLI に変換するだけです。
エラーにある通りMyClass
側にIEquatableインターフェース
を実現する必要があります。(MyClassComparer
は必要ありません)
MyClass
側にIEquatable<MyClass^>
や、vritual bool Equals
、override
を足してください。