C++/CLI 自作クラス(IEquatable)の比較方法がわかりません。

huahi11115 100 評価のポイント
2024-04-12T06:53:27.2566667+00:00
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メソッドが実行されません。この問題の解決方法もわかりません。

御教授をお願いします。

.NET
.NET
.NET ソフトウェア フレームワークに基づく Microsoft テクノロジ。
30 件の質問
C++
C++
C プログラミング言語の拡張機能として作成された高レベルの汎用プログラミング言語。低レベルのメモリ操作機能に加えて、オブジェクト指向、汎用、関数型の機能を備えています。
11 件の質問
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. とっちゃん 400 評価のポイント MVP
    2024-04-12T12:15:19.74+00:00
    namespace Wrapper
    public ref class MyClass : IEquatable<MyClass> 
    {
    // 略
    

    でよいはずですが?

    GetHashCodeはそのままC++/CLI に変換するだけです。

    1 人がこの回答が役に立ったと思いました。

1 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Azulean 0 評価のポイント
    2024-04-12T12:06:06.6966667+00:00

    エラーにある通りMyClass側にIEquatableインターフェースを実現する必要があります。(MyClassComparerは必要ありません)

    MyClass側にIEquatable<MyClass^>や、vritual bool Equalsoverrideを足してください。