2010-06-03 34 views
5

वहाँ किसी भी तरह से करता है, तो एक वस्तु एक स्थिरांक वस्तु या नियमित रूप से वस्तु है पता करने के लिए उदाहरण के लिए निम्नलिखित वर्गस्थिरांक वस्तु और स्थिरांक निर्माता

class String 
{ 
    String(const char* str); 
}; 

पर विचार करता है, तो उपयोगकर्ता String से एक स्थिरांक वस्तु बनाने के तो कोई है, उत्तीर्ण देशी स्ट्रिंग की प्रतिलिपि बनाने का कारण और क्योंकि वह उस पर कोई हेरफेर नहीं करेगा, केवल एक चीज वह करेगी जो स्ट्रिंग आकार, स्ट्रिंग सर्च और अन्य फ़ंक्शंस स्ट्रिंग को नहीं बदलेगी।

+5

जानने का कोई तरीका नहीं है। वास्तव में, 'कॉन्स' केवल ऑब्जेक्ट प्रारंभ होने के बाद ही लागू होता है (कन्स्ट्रक्टर समाप्त होता है), और विनाशक में प्रवेश करने के बाद बंद हो जाता है। – GManNickG

उत्तर

8

प्रतिलिपि बनाने का एक बहुत अच्छा कारण है - आप नहीं जानते कि कॉन्स्ट char का जीवनकाल * स्ट्रिंग ऑब्जेक्ट जैसा ही है। और नहीं, यह जानने का कोई तरीका नहीं है कि आप एक कॉन्स्ट ऑब्जेक्ट बना रहे हैं।

2

दुर्भाग्य से, सी ++ आप जो भी प्रयास कर रहे हैं उसे करने का कोई तरीका नहीं प्रदान करता है। बस एक कॉन्स char * गुजर रहा है स्मृति की आजीवन की गारंटी नहीं देता है। विचार करें:

char * a = new char[10]; 
char const *b = a; 
String c (b); 
delete[] a; 
// c is now broken 
2

आपके बारे में जानने का कोई तरीका नहीं है। आप एक वर्ग लिख सकते हैं जो String के साथ कसकर बातचीत करता है और यह एक बाहरी बफर को इंगित करने वाली स्थिर स्ट्रिंग बनाता है (इसी तरह के कन्स्ट्रक्टर को निजी बनाकर और इंटरैक्टिंग क्लास को नेस्टेड क्लास या String का मित्र बनाकर) बनाता है।

यदि आप चिंता करते हैं कि संभावित रूप से छोटी स्थिर स्ट्रिंग पर गतिशील स्मृति प्रबंधन कर रहा है, तो आप छोटे स्ट्रिंग अनुकूलन (छोटे ऑब्जेक्ट/बफर ऑप्टिमाइज़ेशन) को भी कार्यान्वित कर सकते हैं। यह आपकी स्ट्रिंग क्लास में एक एम्बेडेड बफर करके काम करता है, और प्रत्येक स्ट्रिंग को उस पूर्ववर्ती आकार में उस बफर में कॉपी करता है, और प्रत्येक स्ट्रिंग जो गतिशील आवंटित स्टोरेज के लिए बड़ी होती है (उसी तकनीक का उपयोग छोटे आकार की फ़ंक्शन ऑब्जेक्ट्स को संग्रहीत करने के लिए boost::function द्वारा किया जाता है) ।

class String { 
    union { 
    char *dynamicptr; 
    char buffer[16]; 
    }; 
    bool isDynamic; 
}; 

बफर में ही यहां तक ​​कि एम्बेडेड स्ट्रिंग की लंबाई भंडारण (buffer[15] और इसी तरह के trickeries के रूप में इसकी लंबाई भंडारण) के लिए चालाक तकनीक रहे हैं।

0

जो आप खोज रहे हैं वह मूल रूप से एक गाय (लिखने पर प्रतिलिपि) स्ट्रिंग है। ऐसी चीजें पूरी तरह से संभव हैं, लेकिन उन्हें अच्छी तरह से काम करने के लिए कुछ हद तक गैर-तुच्छ है। एक बहुप्रचारित वातावरण में, अच्छा प्रदर्शन प्राप्त करने से निश्चित रूप से कठिन सीमा में गैर-तुच्छ हो सकता है।

1

आप जो भी खोज रहे हैं उसे करने के लिए आप const_string का उपयोग कर सकते हैं। हालांकि, यहां तक ​​कि कॉन्स स्ट्रिंग के साथ आपको इसे "बताना" है कि स्ट्रिंग को कॉपी करने की आवश्यकता नहीं है।

const char* foo = "c-string"; 
boost::const_string bar(foo); // will copy foo 
boost::const_string baz(boost::ref(foo)); // assumes foo will always be a valid pointer. 
1

उपयोगकर्ता एक स्थिरांक वस्तु बनाने यदि स्ट्रिंग फिर वहाँ से पारित कर दिया देशी स्ट्रिंग कॉपी करने के लिए, साथ ही उसने इस पर कोई हेरफेर नहीं होगा, केवल एक चीज है वह क्या करेंगे स्ट्रिंग आकार मिलता है कि कोई कारण नहीं है से , स्ट्रिंग खोज और अन्य फ़ंक्शन जो स्ट्रिंग को नहीं बदलेगा।

ओह हाँ वहाँ है। बस यह कॉन्स के रूप में गुजरता है इसका मतलब यह नहीं है कि यह वास्तव में कन्स्ट्रक्टर कॉल के बाहर है, और इसका मतलब यह नहीं है कि स्ट्रिंग ऑब्जेक्ट अभी भी मौजूद है, लेकिन इसका मतलब यह नहीं होगा। फंक्शन तर्क के लिए कीवर्ड const का अर्थ केवल यह है कि फ़ंक्शन इसे संशोधित या हटा नहीं देगा (एक फ़ंक्शन को कार्यान्वित करने का प्रयास करने वाला एक कॉन्फ़िगरेशन त्रुटि को संकलित करने का प्रयास करेगा), लेकिन फ़ंक्शन को यह जानने का कोई तरीका नहीं है कि बाहर क्या होता है ।

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