2010-11-17 13 views
11

std::string वास्तव में एक टेम्पलेट श्रेणी के typedef है, मैं इसे कैसे ओवरराइड कर सकता हूं? मैं एक यूटीएफ -8 std::string बनाना चाहता हूं जो अन्य चीजों के साथ सही लंबाई को वापस कर देगा।std :: स्ट्रिंग के कार्यों को ओवरराइट करना और ओवरराइड करना?

उत्तर

15

प्राप्त नहीं करते STRING से

std :: स्ट्रिंग, कि, मूल रूप से पूरे basic_string टेम्पलेट नहीं बनाया गया है है से प्राप्त किया जा करने के लिए। इसके बारे में पहले से ही लेखों के ज़िलियन हैं। इसमें कोई वर्चुअल फ़ंक्शन नहीं है इसलिए ओवरराइड करने के लिए कुछ भी नहीं है। सबसे अच्छा आप कुछ छुपा सकते हैं। रचना/एकत्रीकरण का उपयोग करना सबसे अच्छा है! यही है, बस अपनी कक्षा में टाइप स्ट्रिंग का सदस्य रखें और कॉल अग्रेषित करें! फिर से, बस बनाने के लिए यकीन है कि

STRING

+2

-1। इस कार्य के लिए सबसे अच्छा अभ्यास एक चरित्र गुण वस्तु प्रदान करना और 'std :: basic_string' को तत्काल करना है। इस मामले में 'std :: string' को छिपाने से 'char' signness का मुद्दा उठता है, क्योंकि यूटीएफ -8 एक 8-बिट मल्टीबाइट एन्कोडिंग है। –

+1

@ लार्समैन: कोई आपत्ति नहीं :) मैं इस तथ्य से बहुत व्यस्त था कि किसी ने कहीं नॉनपोलिमॉर्फिक प्रकार से प्राप्त होने का विचार किया था :) –

+0

-1। वास्तव में सवाल का जवाब नहीं देता है। लार्समैन का जवाब कम से कम एक दिशा के लिए एक अच्छा विचार देता है। – leetNightshade

1
  1. आप आईसीयू को देखा है से निकाले जाते हैं नहीं माना जाता?

  2. एक टाइपिफ़ बस एक सुविधाजनक लेबल है।

    कक्षा foo: सार्वजनिक बार {};

बार ठीक काम करता है जब बार एक पीटी का टाइपपीफ होता है।

इस मामले में यह एक अच्छा विचार नहीं हो सकता है, लेकिन भाषा इसका समर्थन करती है।

4

इसे आमतौर पर मानक पुस्तकालय कंटेनर से प्राप्त करने के लिए सी ++ में गलती माना जाता है। हालांकि, जो कार्यक्षमता आप खोज रहे हैं वह पहले ही लागू हो चुकी है। Glib::ustring पर एक नज़र डालें।

आशा है कि इससे मदद मिलती है!

0

बेहतर विचार: std :: string से विरासत के बिना एक एसटीएल-संगत utf8_string कंटेनर बनाएं।

19

आप अपनी खुद की स्ट्रिंग प्रकार को परिभाषित करना होगा, तो std::string से विरासत नहीं करते हैं लेकिन अपनी खुद की Character Traits वर्ग को परिभाषित और तरह

typedef std::basic_string<unsigned char, utf8_traits> utf8string; 

भी देखें Herb Sutter's website कुछ करना।

+0

+1 - एक कारण है 'std :: string' एक 'typedef' है, और यह है। –

+0

दूसरी ओर, मैं यूटीएफ -8 अनुक्रमों को संभालने के लिए 'basic_string' का उपयोग नहीं करता। जब भी आप इसे कुशल बनाने की कोशिश करते हैं तो आप अच्छे से ज्यादा नुकसान करेंगे। –

+3

@Maththieu एम, यह पूरी तरह से निर्भर करता है कि आप कैरेक्टर लक्षणों को कैसे कार्यान्वित करते हैं। मैं दो विकल्प देख सकता हूं: या तो उन्हें यूटीएफ -8 के रूप में सीधे पैक करें और 'state_type' को लागू करें, या उन्हें यूटीएफ -32 के रूप में पैक करें और सीमा पर रूपांतरित करें। किसी भी तरह से, यह बहुत काम है, लेकिन यह एसटीएल एल्गोरिदम के साथ संगतता बरकरार रखता है। –

-1

जैसा कि पहले से ही दूसरों द्वारा बताया गया है: std::string से प्राप्त न करें, यह अभी इसके लिए डिज़ाइन नहीं किया गया है।

आपको this article पर एक नज़र रखना चाहिए, जो दिखाता है कि एक उदाहरण के रूप में केस असंवेदनशील स्ट्रिंग क्लास कैसे बनाएं। आप देखेंगे कि std::basic_string में लागू तर्क चरित्र प्रकार से स्वतंत्र है, और कुछ कस्टम char_traits प्रदान करना चाल चलाना चाहिए।

+1

असल में मैं ऐसा करने की सिफारिश नहीं करता। मैंने कुछ साल पहले ऐसा किया था और मुझे उस फैसले पर अफसोस करना पड़ा। क्या होगा कि आपको अपने नए कोड और मानक स्ट्रिंग प्रकार के बीच, आगे अपने कोड बेस पर कनवर्ट करना होगा। यह सुंदर नहीं है। विस्तार से बताए गए एक महान लेख यहां पाए गए हैं: http://lafstern.org/matt/col2_new.pdf। सारांश: केस असंवेदनशीलता किसी ऑब्जेक्ट के बारे में नहीं है, यह इस बात के बारे में है कि आप किसी ऑब्जेक्ट का उपयोग कैसे करते हैं। –

0

एक यूनिकोड कार्यान्वयन लिखना जो हर परिस्थिति में ठीक से अनुरूपता और काम करता है, करना बहुत मुश्किल है। मैं आपको अपनी खुद की रोलिंग के बजाय मौजूदा पुस्तकालय या कार्यान्वयन का उपयोग करने की सलाह दूंगा। उदाहरण के लिए, विंडोज़, ओएसएक्स और क्यूटी में सभी पुस्तकालय हैं जो यूटीएफ -16 और अन्य एन्कोडेड तारों का समर्थन करते हैं।

1

बस सुनिश्चित करें कि आप जानते हैं कि आप पहले क्या कर रहे हैं। वास्तव में "सही लंबाई" क्या है जो आप अपनी स्ट्रिंग ऑब्जेक्ट्स से वापस करना चाहते हैं? कोड बिंदुओं की संख्या?यह उपयोगकर्ता द्वारा कथित वर्णों की संख्या से हमेशा मेल नहीं खाता है।

वैसे भी, std :: string से प्राप्त करने के लिए वैकल्पिक दृष्टिकोण देखने के लिए utf8-cpp लाइब्रेरी पर एक नज़र डालें।

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