मैं एक कस्टम संस्करण प्रकार को लागू करने की कोशिश कर रहा हूं जो विभिन्न प्रकार के डेटा स्टोर करने के लिए यूनियन का उपयोग करता है। क्षेत्र में type_id
मैं स्टोर करने की योजना बना रहा हूं कि यूनियन में संग्रहीत डेटा किस प्रकार का है। संघ में गैर-तुच्छ सदस्य हैं।गैर-तुच्छ सदस्यों के साथ यूनियन युक्त वर्ग के लिए कन्स्ट्रक्टर और कॉपी-कन्स्ट्रक्टर
struct MyVariant {
enum { t_invalid, t_string, t_int, t_double, t_ptr, t_dictionary } type_id;
union {
int as_int;
double as_double;
std::string as_string;
std::unique_ptr<int> as_ptr;
std::map<int, double> as_dictionary;
};
};
मैं की MyVariant
तरह एक उदाहरण बनाने की कोशिश इस प्रकार है:: कॉल MyVariant की परोक्ष हटाए डिफ़ॉल्ट निर्माता रहे हैं:
MyVariant v;
मैं त्रुटि संदेश मिलता है यहाँ मेरे वर्तमान कार्यान्वयन है। तो, मैं निर्माता मैन्युअल लागू करना चाहते करने की कोशिश की इस प्रकार है:
MyVariant() : type_id{t_int}, as_int{0} {}
जो मुझे देता है एक ऐसी ही त्रुटि संदेश: किसी हटाए समारोह उपयोग करने के लिए प्रयास।
MyVariant(int value) : type_id{t_int}, as_int{value} {}
और मेरे उदाहरण का निर्माण इस प्रकार की तरह: इसके बाद, मैं निम्नलिखित निर्माता को लागू करने की कोशिश की
MyVariant v{123};
=> एक ही त्रुटि संदेश: किसी हटाए समारोह उपयोग करने के लिए प्रयास।
मैंने एक कॉपी कन्स्ट्रक्टर को भी लागू करना शुरू कर दिया है, ऐसा लगता है। हालांकि, निश्चित रूप से यह संकलक त्रुटियों में मदद नहीं करता है।
MyVariant::MyVariant(const MyVariant& other)
{
type_id = other.type_id;
switch (type_id) {
case t_invalid:
break;
case t_string:
new (&as_string) std::string();
as_string = other.as_string;
break;
case t_int:
as_int = other.as_int;
break;
case t_double:
as_double = other.as_double;
break;
case t_ptr:
new (&as_ptr) std::unique_ptr<int>(nullptr);
as_ptr = std::make_unique<int>(*other.as_ptr);
break;
case t_dictionary:
new (&as_dictionary) std::map<int, double>();
// TODO: copy values from other
break;
}
}
मैं संकलक के रूप में एक्सकोड और ऐप्पल एलएलवीएम 6.1 का उपयोग कर रहा हूं।
मुख्य प्रश्न यह है कि: मुझे संकलक त्रुटियां क्यों मिलती हैं जो मुझे मिल रही हैं और इसे संकलित करने के लिए मुझे अपने कोड को कैसे संशोधित करना है?
अतिरिक्त प्रश्न यह है: क्या मैं कन्स्ट्रक्टर और कॉपी कन्स्ट्रक्टर के लिए मेरे कार्यान्वयन के साथ सही तरीके से हूं?
वह डिफ़ॉल्ट कन्स्ट्रक्टर ठीक है। आपको एक विनाशक को लागू करने की आवश्यकता है। –
क्या आपका मतलब माता-पिता के बजाय ब्रेसिज़ का उपयोग करना था जहां आपका एक उदाहरण आवंटित किया गया था? – donjuedo
@donjuedo हां, मेरा मतलब ब्रेसिज़ का उपयोग करना था क्योंकि मैं वर्दी सी ++ 11 प्रारंभिक वाक्यविन्यास से चिपकना चाहता हूं। क्या उनके साथ कुछ गलत है? – j00hi