c++ - Initialize array in constructor without using default constructor or assignment -


विचार करें:

  struct A {A (int); ए (कॉन्स्ट ए और;); }; संरचना बी {ए एफयू [2]; बी (कॉन्स्ट ए एंड एक्स, कॉन्स्ट ए एंड वाई): एफू {x, y} / * यहां समस्या है * / {}};  

मैं इसे काम करने की उम्मीद कर रहा था क्योंकि मैं जीसीसी 4.3 में सी + + 0x समर्थन का उपयोग कर रहा हूं, जो कथित तौर पर प्रारंभिक सूची का समर्थन करता है। कोई खुशी नहीं।

मेरे पास एक कक्षा ए है जिसमें कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है। यह परक्राम्य नहीं है। असाइनमेंट पोस्ट-डिफॉल्ट एक विकल्प नहीं है।

मैं बी बनाने का प्रयास कर रहा हूं जो ए B :: foo का उपयोग करता है std :: vector नहीं हो सकता।

मैं कैसे शुरू कर सकता हूँ < कोड> बी :: एफयू इन बी (...) , अपने तत्वों को बिल्कुल एक बार बनाते समय?

फिलहाल, मैं बी के स्थान पर

<पूर्व> struct B {a foo_a; बी फू_ बी; ए * फ़ू () {जोर ((और amp; foo_b) - * और amp; foo_a) == 1); वापसी और amp; foo_a; } बी (कॉन्स्ट ए एंड एक्स, कॉन्स्ट ए एंड वाई): फू_ए (एक्स), फू_ बी (वाई) {}};

या यहां तक ​​कि char foo [2 * sizeof (A)] का उपयोग करके नियुक्ति के साथ नया - YUK!

निश्चित रूप से एक उचित तरीका है ऐसा करने के लिए?

दुर्भाग्य से, ऐसा करने के लिए वास्तव में कोई उचित, स्वच्छ तरीका नहीं है। उस भाषा की सीमा के बारे में कुछ विचार करें जो C ++ कंट्रोलर्स और सी स्टाइल एरेज़ के अजीब मिश्रण से उत्पन्न होता है। सी ++ 11 मानक इस मुद्दे को बताता है, लेकिन तब तक आपको समाधान के लिए समझौता करना पड़ेगा।

चूंकि के पास कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है, एक संभव कार्य-आसपास है A * पॉइंटर्स की एक सरणी है, और फिर सरणी पर लूप और प्रत्येक को new के साथ आरंभ करें। (जाहिर है, बी के नाशक में सरणी में हटाएं प्रत्येक आइटम को मत भूलें, या सिर्फ स्मार्ट पॉइंटर्स का उपयोग करें।)


Comments