2011-07-20 19 views
5

में सी ++ ऑब्जेक्ट्स की कुछ प्रकार की सूची बनाना मैं सी ++/सीएलआई में सी ++ ऑब्जेक्ट्स की एक सूची/संग्रह बनाने की कोशिश कर रहा हूं और मैंने विभिन्न तरीकों की कोशिश की है लेकिन कुछ भी काम नहीं करता है (संकलन समय में त्रुटियां)।सी ++/सीएलआई

मैं कोशिश की है:

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

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

मेरे आवश्यकताओं:

1) सूची चाहिए सी ++ वस्तुओं

2) मैं एक विशेष वस्तु को दूर करने की क्षमता की जरूरत को शामिल (जैसे वेक्टर काम नहीं करेगा क्योंकि यह केवल पुश/पॉप ऑफ टॉप है)

प्रश्न: मैं किसी विशेष ऑब्जेक्ट को आसानी से निकालने की क्षमता के साथ सी ++/सीएलआई फ़ंक्शन वर्क में सी ++ ऑब्जेक्ट्स की सूची/संग्रह कैसे बना सकता हूं?

मुझे बताएं कि कोई अतिरिक्त जानकारी चाहेगा; आपकी सहायता के लिये पहले से ही धन्यवाद!

+1

कुछ भी नहीं गलत बुला 'std :: वेक्टर :: मिटा साथ () ', यदि आप इसे बहुत करते हैं तो प्रदर्शन के संदर्भ में यह इष्टतम नहीं है। वैकल्पिक रूप से, 'std :: list 'में कहीं भी तेजी से सम्मिलित/मिटा दिया गया है और यह इटरेटर्स को अमान्य नहीं करता है। –

+0

'std :: वेक्टर :: मिटाएं()' ओ (एन) है, सीएलआर 'सूची की तरह। RemoveAt() 'और' ArrayList.RemoveAt() ', इसलिए यदि आप सूची की प्रदर्शन विशेषताओं से खुश हैं , आप वेक्टर के साथ खुश होंगे। –

+0

@ केरेक एसबी: नहीं, इसका उपयोग एक टन नहीं किया जाएगा, इसलिए प्रदर्शन के अनुसार मुझे लगता है कि यह ठीक रहेगा। लेकिन जैसा कि मैंने अभी देखा है, यह केवल एक पैरामीटर के रूप में एक सूचकांक लेता है (एक वस्तु नहीं)? तो मुझे लगता है कि मुझे इंडेक्स ढूंढने के लिए अपनी खोज करना होगा और फिर इसे हटा देना होगा? – developer

उत्तर

2

मूल वस्तुओं/पॉइंटर्स को स्टोर करने के लिए आपको मूल संग्रह कक्षाओं का उपयोग करना होगा। यदि आप संग्रह कक्षा को आवंटन/डीलोकेशन <MyCppObject> का उपयोग करना चाहते हैं, या <MyCppObject*> का उपयोग करें, तो यदि आप मेमोरी आवंटन बनाए रखेंगे (यानी संग्रह वर्ग केवल पॉइंटर्स धारण करेगा)।

एसटीएल/सीएलआर कक्षाएं कुछ विपरीत करेगी - आप .NET ऑब्जेक्ट्स को संग्रहीत करने के लिए एसटीएल कक्षाओं का उपयोग कर सकते हैं।

+0

तब आप किस देशी संग्रह कक्षा का सुझाव देंगे? (यह काम समान रूप से .NET में सूचीबद्ध है) – developer

+0

@ डेवलपर: ['std :: vector <>'] (http://msdn.microsoft.com/en-us/library/9xd04bzs.aspx) प्रत्यक्ष देशी समतुल्य है 'सिस्टम :: संग्रह :: जेनेरिक :: सूची <> 'के लिए। – ildjarn

+1

स्पष्ट रूप से मैं अपने मूल प्रकार के लिए एक सूचक हो सकता है! इसलिए मुझे अब कोई त्रुटि नहीं है। :) http://www.codeproject.com/Messages/2204592/mixed-types-are-not-supported.aspx – developer

3

इसकी या तो अप्रबंधित वस्तुओं के लिए में List<System::IntPtr>^ या std::list (या अपने स्वयं C++ सूची) के रूप में System::IntPtr और फिर चारों ओर आवरण

संपादित करें कि:

आप इसे इस

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])); 
    } 
की तरह कर सकता है

एकमात्र समस्या यह है कि सभी मेमोरी अभी भी अप्रबंधित हिस्से में रहेंगी, इसलिए यदि आपके वर्रों कोके दायरे से बाहर जाना है 0 एस अब मान्य नहीं होगा। इसके अलावा आपको पॉइंटर्स के तहत मेमोरी को मुक्त करने की आवश्यकता है

+0

या 'std :: set' ... या unordered कंटेनर, एसटीएल या Google जैसे अन्य आदि हो सकता है। ... –

1

आप किसी प्रबंधित कंटेनर की जरूरत नहीं है, तो आप देशी list प्रकार का उपयोग कर सकते हैं:

#include <list> 

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

'सिस्टम :: संग्रह :: जेनेरिक :: सूची' एक लिंक्ड सूची नहीं है, यह एक आकार बदलने योग्य है सरणी। नतीजतन, 'std :: vector <>' 'std :: list <>' की तुलना में बेहतर अनुशंसा होगी। – ildjarn

+0

मुझे इस कोड के साथ निम्न त्रुटि मिलती है हालांकि: त्रुटि C4368: प्रबंधित 'MyNamespace :: MyManagedClass' के सदस्य के रूप में 'myList' को परिभाषित नहीं कर सकता: मिश्रित प्रकार समर्थित नहीं हैं। – developer

+0

@ डेवलपर: आह। मैं इंप्रेशन के तहत था कि यह सिर्फ एक स्थानीय चर था। मुझे लगता है कि यह जवाब तब आपके लिए अधिक उपयोग नहीं करेगा। : पी –

0

कोशिश

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; 
संबंधित मुद्दे