2010-06-13 21 views
13

गुमनाम संघ प्रारंभ मैं स्थिर दृश्य स्टूडियो 2010 में निम्नलिखित संरचना प्रारंभ करने में कोशिश कर रहा हूँ:स्थिरता C++

struct Data 
{ 
    int x; 
    union 
    { 
     const Data* data; 
     struct {int x; int y; }; 
    }; 
}; 

निम्नलिखित error C2440: 'initializing' : cannot convert from 'Data *' to 'char' के साथ विफल है।

static Data d1; 
static Data d = {1, &d1}; 
static Data d2 = {1, {1, 2}}; 

मुझे कुछ तरीकों के संदर्भ मिल गए हैं जिन्हें इसे ठीक से शुरू किया जा सकता है लेकिन उनमें से कोई भी VS2010 में काम नहीं करता है। कोई विचार? यह करने के लिए

उत्तर

5

क्या आप ओवरलोडेड कन्स्ट्रक्टर को परिभाषित करके ऐसा कर सकते हैं? Untested आगे कोड:

struct Data 
{ 
    int x; 
    union 
    { 
     const Data* data; 
     struct {int a; int b; } z; 
    } y; 

    Data() 
    { 
     x = 0; 
     y.data = 0; 
     y.z.a = 0; 
     y.z.b = 0; 
    } 

    Data(int x_, Data* data_) 
    { 
     x = x_; 
     y.data = data_; 
    } 

    Data(int x_, int a_, int b_) 
    { 
     x = x_; 
     y.z.a = a_; 
     y.z.b = b_; 
    } 
}; 

static Data d1; 
static Data d(1, &d1); 
static Data d2(1, 1, 2); 
+0

धन्यवाद! मैंने इसे एक व्यावहारिक समाधान में बनाया है। – wpfwannabe

2

बदलें:

struct Data 
{ 
    int x; 
    union 
    { 
     const Data* data; 
     char ch; 
    }; 
}; 

static Data d1; 
static Data d = {1, &d1}; 
+0

दरअसल कि काम करता है, लेकिन मैं अपने वास्तविक जीवन के मामले oversimplified है तो अब मैं एक बेहतर कोड है जो 'd2' के लिए विफल रहता है के साथ सवाल को अद्यतन किया है प्रारंभ। – wpfwannabe

+0

मुझे लगता है कि यह नवागंतुकों के लिए स्पष्ट नहीं है कि यह क्यों काम करना चाहिए। मैं हमेशा इस तरह के अपने उत्तरों के लिए एक छोटा सा स्पष्टीकरण जोड़ता हूं। –

24

आईएसओ सी ++ 03 8.5.1 [dcl.init.aggr]/15:

जब एक संघ एक ब्रेस संलग्न प्रारंभकर्ता साथ आरंभ नहीं हो जाता , ब्रेसिज़ में संघ के पहले सदस्य के लिए केवल प्रारंभकर्ता होगा। [उदाहरण:

union u { int a; char* b; }; 
u a = { 1 }; 
u b = a; 
u c = 1; // error 
u d = { 0, "asdf" }; // error 
u e = { "asdf" }; // error 

अंत उदाहरण]

तो, आम तौर पर बोल रहा है, यह नहीं किया जा सकता।

+0

बहुत बहुत धन्यवाद! मुझे डर था कि जवाब होगा। आपके लिए +1 वोट दें लेकिन उपयोग योग्य कामकाज के लिए 'क्रिसडब्ल्यू' का जवाब दें। – wpfwannabe

1

आप इस कार्य करवा सकते हैं यदि आपके सभी संघ प्रकार संकेत दिए गए हैं, संघ के पहले तत्व के रूप में एक शून्य सूचक का उपयोग करके। सभी पॉइंटर्स को शून्य सूचक में परिवर्तित किया जा सकता है, इसलिए आपके संघ को मनमाने ढंग से सूचक प्रकार के साथ प्रारंभ किया जा सकता है। दिए गए उदाहरण के लिए, आपको मिलता है:

struct Data 
{ 
    int x; 
    union 
    { 
     const void* unused; 
     const Data* data; 
     struct {int x; int y; }*; //Not sure this works written like this 
     const char* asChar; 
     const int* asInt; 
    }; 
}; 

static Data d1; 
static Data d2 = {2, &d1}; 
static Data d3 = {1, "Hello, world!"}; 

अन्य संभावना सी में इसके बजाय ऐसा करना है। सी में आप निर्दिष्ट कर सकते हैं कि यूनियन का कौन सा हिस्सा प्रारंभ किया गया है। अपने मूल struct का उपयोग करना (और अपने संरचना नाम asStruct दे रही है):

static Data d1; 
static Data d2 = {2, &d1}; 
static Data d3 = {3, {.asStruct = {0,0}} 
संबंधित मुद्दे