2008-09-17 71 views
5

我包装一本地C++类,它有下面的方法:转换的std ::矢量<>:迭代在C .NET接口++/CLI

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代表这种相同类型界面的“方式”?一个返回数组的方法<>?数组<>泛型是否有迭代器,以便我可以实现BeginLocals()和EndLocals()?

2)如果本地声明为在.NET包装一个值结构

我真的很想代表与.NET的味道包裹类,但我很新的管理世界 - 这种类型的信息是令人沮丧的谷歌......

回答

5

迭代AREN完全可以转换为“.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的方式”只是简单地让人们为自己创建名单< Local>项目。如果您确实想要控制迭代或使集合更加自定义,那么您的集合也要实现IEnumerable 和/或集合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) 
{ 
... 
} 
0

@Phillip - 谢谢,你的回答真让我开始在正确的方向。

看到你的代码,并在行动在尼什的书C++/CLI做多一点阅读后,我认为使用索引属性,它返回一个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; 
}; 
+0

这是一个好方法,但您可能还想确保至少公开Count属性:)。另外一个注意事项是,在不暴露列表或实现IEnumerable < T >的情况下,该类将不能用于.net 3.5中的LINQ扩展 – 2008-09-17 20:38:43

相关问题