2011-05-16 12 views
8

आज C++/CLI में बनाने मुझे लगता है कि स्थिर शब्दकोश बनाता है और यह initializes सी # कोड देखा:स्थिर शब्दकोश प्रारंभ करते हुए

public static readonly Dictionary<string, string> dict = new Dictionary<string, string>() 
     { 
      {"br","value1"}, 
      {"cn","value2"}, 
      {"de","value3"}, 
     }; 

लेकिन जब मैं C++/CLI के लिए एक ही कोड लिखने का फैसला किया, एक त्रुटि हुई। यहां मेरा प्रयास है:

static System::Collections::Generic::Dictionary<System::String^, System::String^>^ dict = gcnew System::Collections::Generic::Dictionary<System::String^, System::String^>() 
    { 
     {"br","value1"}, 
     {"cn","value2"}, 
     {"de","value3"}, 
    }; 

क्या मैं ऐसा कर सकता हूं और यदि ऐसा है, तो कैसे?

+0

[सी ++ सीएलआई संग्रह प्रारंभकर्ता वाक्यविन्यास] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/1923928/c-cli-collection-initializer-syntax) –

उत्तर

6

सी # 3.0 और बाद में उपयोगकर्ताओं को "प्रारंभकर्ता" परिभाषित करने की अनुमति देता है; संग्रह के लिए, यह तत्वों की एक श्रृंखला है, जो शब्दकोशों के लिए कुंजी और मानों के लिए सुव्यवस्थित है। सी ++। मेरे ज्ञान के लिए नेट में इस भाषा की सुविधा नहीं है। यह प्रश्न देखें: यह बहुत समान है: Array initialization in Managed C++। ऐरे प्रारंभकर्ता केवल सी ++ में ऐसे प्रारंभिक हैं; अन्य संग्रह उन्हें सी ++ में पेश नहीं करते हैं।

असल में, आपका मुख्य विकल्प एक स्थिर निर्माता घोषित करना और वहां अपना शब्दकोश प्रारंभ करना है।

3

इस प्रकार का Dictionary<T> प्रारंभिकता कक्षा की खुद की विशेषता नहीं है, बल्कि सी # कंपाइलर है। यह Dictionary<T> ऑब्जेक्ट के निर्माण के लिए अलग-अलग बयानों में अनुवाद करता है, और प्रत्येक कुंजी/मूल्य जोड़ी का निर्माण और जोड़। मुझे विश्वास नहीं है कि सी ++ कंपाइलर एक ही क्षमता प्रदान करता है।

+0

इसका मतलब है कि मैं इसे शुरू नहीं कर सकता जैसे मैं करता हूं सी# ? –

+1

ठीक है, इसे अलग-अलग करने की आवश्यकता होगी। – dlev

+0

असल में, हां। यह प्रबंधित सी ++ में उपलब्ध सी # की भाषा सुविधा नहीं है। – KeithS

0

मेरे दृष्टिकोण (.NET 4.5) है:

// file.h 
using namespace System; 
using namespace System::Collections::Generic; 
// SomeClass 
public://or private: 
    static Dictionary<String^, String^>^ dict = dictInitializer(); 
private: 
    static Dictionary<String^, String^>^ dictInitializer(); 

// file.cpp 
#include "file.h" 
Dictionary<String^, String^>^ SomeClass::dictInitializer(){ 
    Dictionary<String^, String^>^ dict = gcnew Dictionary<String^, String^>; 
    dict->Add("br","value1"); 
    dict->Add("cn","value2"); 
    dict->Add("de","value3"); 
    return dict; 
} 
0

यह संभव है! :-)
नहीं सीधी-सपाट है, लेकिन एक छोटे से सहायक समारोह के साथ आप बना सकते हैं और कोड की एक पंक्ति में एक शब्दकोश init कर सकते हैं:

// helper class 
generic <class TKey, class TValue> 
ref class CDict 
{ 
public: 
    static Dictionary<TKey, TValue>^ CreateDictionary (...array<KeyValuePair<TKey, TValue>>^ i_aValues) 
    { 
    Dictionary<TKey, TValue>^ dict = gcnew Dictionary<TKey, TValue>; 
    for (int ixCnt = 0; ixCnt < (i_aValues ? i_aValues->Length : 0); ixCnt++) 
     dict->Add (i_aValues[ixCnt].Key, i_aValues[ixCnt].Value); 
    return dict; 
    } 
}; 

// Test 
ref class CTest 
{ 
public: 
    static Dictionary<int, String^>^ ms_dict = CDict<int, String^>::CreateDictionary (gcnew array<KeyValuePair<int, String^>> 
    { 
    KeyValuePair<int, String^>(1, "A"), 
    KeyValuePair<int, String^>(2, "B") 
    }); 
}; 

int main() 
{ 
    for each (KeyValuePair<int, String^> kvp in CTest::ms_dict) 
    Console::WriteLine (kvp.Key.ToString() + " " + kvp.Value); 
} 

परीक्षण किया गया, काम कर रहे।

संबंधित मुद्दे