2012-06-11 16 views
20

द्वारा गुजरने वाले निम्नलिखित प्रोग्राम में पॉइंटर्स के वेक्टर के शरीर कोसिस्ट। अंक एक्स, वाई, जेड निर्देशांक और एक बिंदु_आईडी की एक संरचना है। मेरा मानना ​​है कि शरीर को कॉन्स संदर्भ द्वारा पारित किया गया है, निम्नलिखित चरण में एक त्रुटि उत्पन्न होनी चाहिए। कार्यक्रम बिना किसी समस्या के चल रहा है। क्या आप कृपया मुझे समझा सकते हैं कि यह क्यों है।सी ++ कॉन्स संदर्भ

void readOutFile(const Body& body, int n){ 

    .... 

    body.bp[0]->points.push_back(Point_id(p,i)); 
} 
+2

'बॉडी 'को' कॉन्स्ट 'के रूप में पारित किया गया है लेकिन कंपाइलर को यह जानने का कोई तरीका नहीं है कि' body.bp [0] -> अंक' भी 'const' होना चाहिए। – wroniasty

+0

यह ठीक चलाएगा और कॉन्स्ट त्रुटि एक संकलित समय त्रुटि होगी, रन टाइम त्रुटि नहीं। –

+3

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

उत्तर

6

केवल body स्थिर है।

body.bp[0]->points कोई रास्ता नहीं body

38

यहाँ की constantness से प्रभावित मुद्दा है:

body.bp[0]->points.push_back(Point_id(p,i)); 
      ^^ 

एक सूचक के माध्यम से Indirecting किसी भी constness को हटा; बल्कि, परिणाम की स्थिरता सूचक के प्रकार पर निर्भर है।

T *t;    // pointer to T: can modify t and (*t) 
const T *t;  // pointer to const-T: can modify t but not (*t) 
T *const t;  // const-pointer to T: can modify (*t) but not t 
const T *const t; // const-pointer to const-T: can't modify either t or (*t) 
+3

मैंने कभी यह महसूस नहीं किया लेकिन यह समझ में आता है। दृढ़ता सदस्य सूचक को प्रचारित करती है लेकिन इसकी सामग्री भी नहीं। –

6

हाँ, body स्थिर है। इसका मतलब है कि कोई गैर-कॉन्स्ट सदस्य फ़ंक्शन नहीं कहा जा सकता है, और कोई सदस्य चर संशोधित नहीं किया जा सकता है।

न तो किया जा रहा है। इस्तेमाल किया body के एकमात्र सदस्य body.bp[0], जो या तो नहीं बदला गया है, लेकिन केवल points पर प्राप्त करने के लिए प्रयोग किया जाता है, जो या स्थिर नहीं हो सकता है हो सकता है ...

Corrolary है: डेटा सदस्यों को सार्वजनिक न करें।

16

यह सबसे अच्छा उदाहरण है जो दिखाता है कि data members should not be public क्यों दिखाता है।

यहाँ

, body इसलिए इसकी डेटा सदस्यों बदला नहीं जाना चाहिए स्थिर है, लेकिन body.bp[0]->points बिंदु में बदला जा रहा है जो Body .Hence कोई स्थिरांक उल्लंघन के सदस्य नहीं है।

+5

मेरे लिए, यह एक उदाहरण है कि क्यों ** सदस्य पॉइंटर्स ** सार्वजनिक नहीं होना चाहिए। सार्वजनिक "मूल्य" डेटा सदस्यों के साथ कुछ भी गलत नहीं है। – ulidtko

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