Преобразование станд.:: вектор <>:: итератор к.NET соединяет интерфейсом в C++ / с CLI

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

5
задан Joel Coehoorn 1 October 2008 в 17:03
поделиться

2 ответа

Итераторы не точно переводимы к ".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 путь" должен был бы просто позволить людям создавать Список <Локальные> объекты для себя. Если Вы действительно хотите управлять повторением или сделать набор более пользовательским, иметь Вашу реализацию набора 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)  
{
 ... 
}
5
ответ дан 14 December 2019 в 19:31
поделиться

@Phillip - Спасибо, Ваш ответ действительно запустил меня в правильном направлении.

После наблюдения Вашего кода и выполнения немного большего количества чтения в книге Ниша C++ / CLI в Действии, я думаю с помощью индексируемого свойства, которое возвращается, дескриптор отслеживания константы к Локальному экземпляру на управляемой "куче" является, вероятно, лучшим подходом. Я закончил тем, что реализовал что-то подобное следующему:

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
ответ дан 14 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: