c++ - Using enum with string variables -
मैं ऐसा कुछ करने की कोशिश कर रहा हूं,
enum Data_Property {NAME, DATETIME , प्रकार, }; Struct Item_properties {char * नाम; चार * दिनांक समय; इंट टाइप; }; Int main () {std :: string डेटा = "/ नाम Item_Name / DATETIME [टाइमस्टैम्प] / प्रकार [पूर्णांक मान]"; Std :: सूची & lt; std :: string & gt; known_properties; known_properties.push_back ( "/ नाम"); known_properties.push_back ( "/ DATETIME"); known_properties.push_back ( "/ प्रकार"); मद_प्रॉपर्टीज item_p = extract_properties (डेटा); // मैं एक संरचना में गुण / गुण प्राप्त करने के लिए एक फ़ंक्शन का उपयोग करता हूं / /
मुझे यह जानना चाहिए कि मैं इसे किसी भी सरल बनाने के लिए किसी भी तरह से कर सकता हूँ? // यहाँ मैं एक स्विच-केस बयान का उपयोग करना चाहता हूं। या मैं एक एंम के साथ (/ NAME / DATETIME / TYPE) की तरह संपत्ति की चाबियाँ कैसे संयोजित करूंगा और std :: list अर्थात known_properties?
सबसे पहले, मुझे यह कहना है कि हमेशा एक वैकल्पिक विकल्प है, मेरे दर्शन में से एक
हम बिग पिक्चर को देखें आप स्ट्रिंग से एक आइटम को पढ़ने का प्रयास कर रहे हैं आइटम डेटाम का एक कंटेनर है ऑब्जेक्ट ओरिएंटेड शब्दों में, आइटम प्रत्येक डेटा को स्ट्रिंग से अपने डेटा लोड करने के लिए चाहेंगे। आइटम को पता करने की आवश्यकता नहीं है कैसे एक डेटा को लोड करने के लिए, क्योंकि यह प्रत्येक डेटा से इसकी मांग कर सकता है
आपका डेटा वास्तव में सी ++ सरल पीओडी प्रकारों से अधिक जटिल और बुद्धिमान है। (सरल पीओडी प्रकारों में फ़ील्ड नाम नहीं हैं।) इसलिए, आपको ये प्रतिनिधित्व करने के लिए कक्षाएं बनाने की आवश्यकता है (या अतिरिक्त जटिलता को समझाकर) मेरा विश्वास करो, यह लंबे समय से बेहतर होगा।
यहां रिफैक्टरिंग नाम
सदस्य का एक सरल उदाहरण है:
स्ट्रेट Name_Field {std :: string मान; // std पसंद करने के लिए अपनी आदतों को बदलें: चार * शून्य से लोड करने के लिए स्ट्रिंग (const std :: string & text, const std :: string :: size_type और start_position = 0) {value.clear (); Std :: string :: size_type स्थिति = 0; स्थिति = टेक्स्ट.फिंड ("/ नाम", प्रारंभिक स्थिति); यदि (स्थिति! = Std :: string :: npos) / / फ़ील्ड का नाम पाया गया था {// अगला स्थान छोड़ें ++ स्थिति; // पाठ के अंत के लिए जाँच करें यदि (स्थिति & lt; text.length ()) {std :: string :: size_t end_position; End_position = text.find_first_not_of ("", स्थिति); यदि (end_position! = Std :: string :: npos) {value = text.substr (स्थिति, अंत_स्थान - स्थिति); }}}};
अब आप आइटम वर्ग में load_from
जोड़ सकते हैं:
struct आइटम {Name_Field नाम; चार * दिनांक समय; चार * प्रकार; Void load_from (const std :: स्ट्रिंग और पाठ) {std :: string :: size_t position = 0; // नोटिस, नाम का सदस्य अपने डेटा को लोड करने के लिए उत्तरदायी है, // मद वर्ग से राहत कैसे कर सकता है जानने से। Name.load_from (पाठ, स्थिति); }};
आइटम लोड करने के लिए:
आइटम new_item; new_item.load_from (डेटा);
आप रिफ्लेक्टर के रूप में, सामान्य तरीकों से अवगत रहें उदाहरण के लिए, आप Name_Field
और DateTime_Field
के बीच एक आधार (अभिभावक) वर्ग, Field_Base
के बीच सामान्य विधियां डाल सकते हैं। यह आपके कोड और डिज़ाइन को आसान बना देगा और साथ ही फिर से प्रयोज्यता का समर्थन करेगा।
Comments
Post a Comment