5

次のメソッドを持つネイティブ C++ クラスをラップしています。

class Native
{
    public:
    class Local
    {
        std::string m_Str;
        int m_Int;
    };

    typedef std::vector<Local> LocalVec;
    typedef LocalVec::iterator LocalIter;

    LocalIter BeginLocals();
    LocalIter EndLocals();

    private:
        LocalVec m_Locals;
};

1) この同じ種類のインターフェイスを表す ".NET の方法" は何ですか? 配列を返す単一のメソッド<>? array<> ジェネリックには反復子があるので、BeginLocals() と EndLocals() を実装できますか?

2) Localは .NET ラッパーで値構造体として宣言する必要がありますか?

ラップされたクラスを .NET フレーバーで表現したいのですが、管理された世界に慣れていないので、この種の情報をグーグルで検索するのはイライラします...

4

2 に答える 2

5

イテレータは「.net の方法」に正確に変換できるわけではありませんが、大まかに IEnumerable < T > と IEnumerator < T > に置き換えられます。

それよりも

  vector<int> a_vector;
  vector<int>::iterator a_iterator;
  for(int i= 0; i < 100; i++)
  {
    a_vector.push_back(i);
  }

  int total = 0;
  a_iterator = a_vector.begin();
  while( a_iterator != a_vector.end() ) {
    total += *a_iterator;
    a_iterator++;
  }

あなたが見るでしょう(C#で)

List<int> a_list = new List<int>();
for(int i=0; i < 100; i++)
{
  a_list.Add(i);
}
int total = 0;
foreach( int item in a_list)
{
  total += item;
}

または、より明示的に (IEnumerator を foreach 構文シュガーの背後に隠すことなく):

List<int> a_list = new List<int>();
for (int i = 0; i < 100; i++)
{
    a_list.Add(i);
}
int total = 0;
IEnumerator<int> a_enumerator = a_list.GetEnumerator();
while (a_enumerator.MoveNext())
{
    total += a_enumerator.Current;
}

ご覧のとおり、foreach は .net 列挙子を隠しているだけです。

つまり、「.net の方法」とは、人々が List< Local > アイテムを自分で作成できるようにすることです。繰り返しを制御したり、コレクションをもう少しカスタマイズしたい場合は、コレクションに IEnumerable< T > や ICollection< T > インターフェイスを実装させます。

C# へのほぼ直接的な翻訳は、あなたが想定したものとほぼ同じです。

public class Native
{
  public class Local
  { 
     public string m_str;
     public int m_int;
  }

  private List<Local> m_Locals = new List<Local>();

  public List<Local> Locals
  {
    get{ return m_Locals;}
  }
}

その後、ユーザーは次のことができるようになります

foreach( Local item in someNative.Locals)  
{
 ... 
}
于 2008-09-17T17:03:41.627 に答える
0

@フィリップ-ありがとう、あなたの答えは本当に私を正しい方向に導きました.

あなたのコードを見て、Nish の著書C++/CLI in Actionをもう少し読んだ後、マネージ ヒープの Local インスタンスに const 追跡ハンドルを返すインデックス付きプロパティを使用するのがおそらく最善の方法だと思います。最終的に、次のようなものを実装しました。

public ref class Managed
{
    public:
    ref class Local
    {
        String^ m_Str;
        int m_Int;
    };

    property const Local^ Locals[int]
    {
        const Local^ get(int Index)
        {
            // error checking here...
            return m_Locals[Index];
        }
    };

    private:
        List<Local^> m_Locals;
};
于 2008-09-17T19:45:20.380 に答える