2011-07-20 2 views
5

J'essaye de créer une liste/collection d'objets C++ en C++/CLI et j'ai essayé plusieurs façons mais rien ne semble fonctionner (erreurs à la compilation).Création d'une sorte de liste d'objets C++ en C++/CLI

J'ai essayé:

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

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

Mes besoins:

1) La liste doit contenir C++ objets

2) J'ai besoin la possibilité de supprimer un objet particulier (par exemple vecteur ne fonctionnera pas parce que c'est seulement pousser/sauter du haut)

Question: Comment faire pour qu'une liste/collection d'objets C++ dans une fonction C++/CLI fonctionne avec la possibilité de supprimer facilement un objet particulier? Faites-moi savoir si quelqu'un voudrait des informations supplémentaires; Merci d'avance pour votre aide!

+1

Rien de mal à appeler 'std :: vecteur :: effacement () ', ce n'est pas optimal en termes de performance si vous le faites beaucoup. Alternativement, 'std :: list ' a une insertion/effacement rapide n'importe où et n'invalide pas les itérateurs. –

+0

'std :: vector :: erase()' est O (N), tout comme le CLR 'Liste .RemoveAt()' et 'ArrayList.RemoveAt()', donc si vous êtes satisfait des caractéristiques de performance de List , vous seriez heureux avec le vecteur. –

+0

@Kerrek SB: non, il ne serait pas utilisé une tonne, donc la performance sage je suppose que ce serait bien. Mais comme je le vois maintenant, il ne prend qu'un index en paramètre (pas un objet)? Donc, je suppose que je devrais faire ma propre recherche pour trouver l'index, puis l'enlever? – developer

Répondre

2

Pour stocker des objets/pointeurs natifs, vous devez utiliser des classes de collection natives. Si vous souhaitez que la classe de collection gère l'allocation/désallocation, utilisez <MyCppObject> ou utilisez <MyCppObject*> si vous voulez conserver l'allocation de mémoire (c'est-à-dire que la classe de collection contiendra uniquement les pointeurs).

Les classes STL/CLR feraient quelque chose de contraire - vous pouvez utiliser des classes STL pour stocker des objets .NET.

+0

Quelles classes de collections natives suggérez-vous alors? (Cela fonctionne de la même manière que List dans .Net) – developer

+0

@developer: ['std :: vector <>' (http://msdn.microsoft.com/fr-fr/library/9xd04bzs.aspx) est l'équivalent natif direct à 'System :: Collections :: Generic :: List <>'. – ildjarn

+1

Apparemment, je peux avoir un pointeur vers mon type natif! Donc je n'ai plus d'erreur. :) http://www.codeproject.com/Messages/2204592/mixed-types-are-not-supported.aspx – developer

3

Son soit System::IntPtr à des objets non gérés comme dans List<System::IntPtr>^ ou std::list (ou votre propre C++ liste) et l'enveloppe puis autour de cette

EDIT:

Vous pouvez le faire comme ça

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])); 
    } 

Le seul problème est que toute la mémoire résidera toujours dans la partie non gérée, donc si vos vars sortent de la portée IntPtr s ne sera plus valide. Vous devez également libérer la mémoire sous les pointeurs vous-même

+0

ou 'std :: set' ... ou conteneur non ordonné, pourrait être STL ou d'autres comme Google etc ... –

1

Si vous n'avez pas besoin d'un conteneur géré, vous pouvez utiliser le type list natif:

#include <list> 

std::list<MyCppObject*> mylist; 
// ... 
mylist.remove(mycppobjptr); 
+0

'System :: Collections :: Generic :: List' n'est pas une liste liée, c'est un redimensionnable tableau. Par conséquent, 'std :: vector <>' serait une meilleure recommandation que 'std :: list <>'. – ildjarn

+0

Je reçois l'erreur suivante avec ce code cependant: erreur C4368: impossible de définir 'myList' en tant que membre de 'MyNamespace :: MyManagedClass' géré: les types mixtes ne sont pas pris en charge. – developer

+0

@ développeur: Aha. J'étais sous l'impression que c'était juste une variable locale. Je suppose que cette réponse ne vous sera pas très utile à ce moment-là. : P –

0

essayer

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;