2013-05-14 8 views
5

के संदर्भ को सब्सक्राइब करना मैं यहां कुछ सी ++ कोड देख रहा हूं और कुछ समझ नहीं रहा हूं। यह अप्रासंगिक है लेकिन यह एक YARP (रोबोट मिडलवेयर) ट्यूटोरियल से आता है जो दस्तावेज़ीकरण के साथ जाता है।कॉन्स

virtual void getHeader(const Bytes& header) 
{ 
    const char *target = "HUMANITY"; 
    for (int i=0; i<8 && i<header.length(); i++) 
    { 
    header.get()[i] = target[i]; 
    } 
} 

अब, हेडर कॉन्स का संदर्भ है और इस प्रकार इस फ़ंक्शन के भीतर संशोधित नहीं किया जा सकता है। get पर इसे कहा जाता है, इसका प्रोटोटाइप char *get() const; है। header.get() कैसे सब्सक्राइब किया जा सकता है और संशोधित किया जा सकता है? कार्यक्रम ठीक संकलित करता है। मुझे यह नहीं समझा होगा कि यहां क्या होता है लेकिन मैं स्वयं को सी ++ प्राइमर में पढ़ा गया हूं ...

मैं थोड़ा सा स्पष्टीकरण की सराहना करता हूं!

आपका दिन शुभ हो,

+0

'char * get() const;' मतलब है कि चार को पॉइंटर संशोधित नहीं किया जा सकता है। पॉइंट हो सकता है। – octoback

+1

आप "char * const get()" के बारे में सोच रहे हैं। फ़ंक्शन के दाईं ओर "कॉन्स्ट" का अर्थ है "गैर-परिवर्तनीय सदस्यों को संशोधित नहीं करता है" – kfsone

उत्तर

0

जो कोई इंटरफेस डिजाइन किया फैसला किया है कि एक const Byte वस्तु की सामग्री में भरने मूल्यों के द्वारा संशोधित किया जा सकता है। संभवतः उन्होंने header.get()[i] को संशोधित करने के लिए आवश्यक जो भी हैक किए हैं। मैं इस कोड का उपयोग अच्छे इंटरफ़ेस डिज़ाइन के उदाहरण के रूप में नहीं करता।

+0

ठीक है, मुझे पता चला कि यह स्पष्ट रूप से इष्टतम कोडिंग नहीं था। मैंने थोड़ा गहरा खोला है और यह पता चला है कि 'get()' केवल 'डेटा' नामक एक विशेषता देता है जो 'char *' है। 'Get()' फ़ंक्शन वास्तव में कॉन्स्ट था लेकिन यह ऐसा कुछ लौटा जो नहीं था। – technimage

0

header.get()char* लौटा देना चाहिए, इसे आधार पता के रूप में मानना ​​चाहिए और [i] के साथ अनुक्रमित किया गया है और उस स्थान पर target में स्ट्रिंग किया गया है।

@antitrust अच्छा बिंदु दिया गया, वापसी पता पता सामग्री द्वारा संशोधित नहीं किया जा सकता है उदा।

get()[i] = target[i]; 

यह x को target स्ट्रिंग कॉपी करेंगे जब xनिजी सदस्य वर्ग के लिए है, इस विधि उपयोगी हो सकता है, और आप को कॉपी करने की कर रहे हैं:

char x[100]; 
char* get() const 
{ 
    return x; 
} 

पूर्णांक बुला समारोह आप की तरह कर सकते हैं x में।

संपादित अगर मिल() a inline function तो बुला प्राप्त() एक पाश प्रदर्शन को प्रभावित नहीं करेगा में कार्य है।, मेरा मतलब है इस तरह के समारोह इनलाइन परिभाषित किया जाना चाहिए।

+0

लेकिन 'हेड बाइट्स और हेडर' क्यों 'हेडर' के आंतरिक डेटा सदस्यों को लिखने पर रोक लगाता है? – Vorac

+0

@ वोराक 'कॉन्स बाइट्स 'का अर्थ है कॉन्स्ट के संदर्भ में, आप कॉन्स बदल नहीं सकते हैं। [संदर्भ बनाम सूचक] के लिए यहां देखें (http://stackoverflow.com/questions/15995463/in-function-declaration-return-type/15995482#15995482) वापसी प्रकार –

+0

के रूप में यह इनलाइन परिभाषित नहीं है। मैं यह सब प्राप्त करना शुरू कर रहा हूं, आप सभी को धन्यवाद! – technimage

0

doc को देखते हुए:

struct Bytes { 
    char* get() const; // works 
    char*& get() const; // would not work 
    char* mem_; 
}; 

इस कोड को भले ही यह बुरा व्यवहार है पूरी तरह से वैध है। समस्या यह है कि सूचक की एक प्रति बनाई गई है और वर्ग की स्थिरता lost है। सी ++ में स्थिरता काफी हद तक वैचारिक और ब्रेक (अक्सर परिणामों के बिना भी) आसान है। मैं कार्यान्वयनकर्ता से शिकायत करता हूं। यह इस तरह दिखना चाहिए:

struct Bytes { 
    char* get(); // works 
    const char* get() const; // would not work 
    char* mem_; 
}; 
1
char *get() const; 

दाहिने हाथ स्थिरांक का अर्थ है "इस सदस्य वर्ग कि परिवर्तनशील नहीं है में कुछ भी परिवर्तन नहीं करता है", और यह है कि सम्मान कर रहा है - यह कुछ भी नहीं बदल रहा है। कार्यान्वयन शायद इस तरह कुछ है:

char *Bytes::get() const 
{ 
    return const_cast<char *>(m_bytes); 
} 

हालांकि, जो सूचक वापस लौटाया जा रहा है, वह एक साधारण "char *" है।इस बारे में सोचें:

(header.get())[i] = target[i]; 
// or 
char* p = header.get(); 
p[i] = target[i]; 
+0

बिल्कुल, यह एक char * एक कॉन्स char * नहीं देता है। –

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