Создание своего рода списка объектов C ++ в C ++ / CLI - PullRequest
5 голосов
/ 20 июля 2011

Я пытаюсь создать список / коллекцию объектов C ++ в C ++ / CLI, и я пробовал различные способы, но, похоже, ничего не работает (ошибки во время компиляции).

Я пытался:

List<MyCppObject*> ^myList; //Does not allow non-.NET objects

ArrayList ^myList;
...
myList->Remove(myCppObject); //cannot convert parameter 1 from 'MyCppObject *' to 'System::Object ^'

Мои требования:

1) Список ДОЛЖЕН содержать объекты C ++

2) Мне нужна возможность удалить конкретный объект (например, выигранный векторне работает, потому что это только push / pop up)

Вопрос: Как заставить список / коллекцию объектов C ++ в функции C ++ / CLI работать с возможностью простого удаленияконкретный объект?

Дайте мне знать, если кому-то нужна дополнительная информация;заранее спасибо за помощь!

Ответы [ 4 ]

3 голосов
/ 20 июля 2011

Это либо System::IntPtr для неуправляемых объектов, как в List<System::IntPtr>^ или std::list (или ваш собственный список c ++), а затем обертка вокруг этого

РЕДАКТИРОВАТЬ:

Вы можете сделать это следующим образом

MyCppObject mynativeobj[10];
    System::Collections::Generic::List<System::IntPtr>^ mlist = gcnew System::Collections::Generic::List<System::IntPtr>();

    for(int i =0;i<10;i++)
    {
        mlist->Add(System::IntPtr((void*)&mynativeobj[i]));
    }

Единственная проблема заключается в том, что вся память будет по-прежнему находиться в неуправляемой части, поэтому, если ваши переменные выйдут из области видимости, IntPtr не будут действительнымибольше.Также вам нужно самостоятельно освободить память под указателями

2 голосов
/ 20 июля 2011

Для хранения собственных объектов / указателей вы должны использовать собственные классы коллекций. Если вы хотите, чтобы класс коллекции поддерживал выделение / освобождение, используйте <MyCppObject> или используйте <MyCppObject*>, если вы хотите сохранить выделение памяти (т.е. класс коллекции будет содержать только указатели).

Классы STL / CLR будут делать что-то противоположное - вы можете использовать классы STL для хранения объектов .NET.

1 голос
/ 20 июля 2011

Если вам не нужен управляемый контейнер, вы можете использовать собственный тип list:

#include <list>

std::list<MyCppObject*> mylist;
// ...
mylist.remove(mycppobjptr);
0 голосов
/ 16 февраля 2012

попробуй

single object
MyCppObject^ _myCppObject = gcnew MyCppObject();

list of objects
List< MyCppObject ^>^ LIST = gcnew List< MyCppObject >();

add single element
LIST->Add( _myCppObject );

// remove single element
LIST->Remove( _myCppObject );

// these are all managed objects so when loss of scope it self destructs

// although such might be the case as per System::GC, you may still do...

LIST->Clear();

delete LIST;

LIST = nullptr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...