2015-10-21 6 views
23

मेरे पास फ़ंक्शन है जो तर्क के रूप में संदर्भ संदर्भ स्वीकार करता है। इसे तर्क नहीं बदलना चाहिए, लेकिन यह करता है (परिवर्तनीय "_isVertex")। इसे कैसे सुधारा जा सकता है? यहां कोड है:फ़ंक्शन में कॉन्स ऑब्जेक्ट

#include <vector> 
#include <iostream> 

using namespace std; 

class Element 
{ 
public: 
    bool isVertex() const 
    { return _isVertex; }; 

private: 
    bool _isVertex = true; 
}; 

class ElementContainer : public vector <Element> 
{ 
public: 
    void push(const Element &t) 
    { 
     // here everything is fine 
     cerr << t.isVertex() << ' '; 
     push_back(t); 
     // and here _isVertex is false, should be true! 
     cerr << t.isVertex() << '\n'; 
    } 
}; 

int main() 
{ 
    ElementContainer vertex; 

    vertex.push({}); 
    vertex.push(vertex[0]); 
} 
+0

प्लस वन: आपको मिल गया है। ध्यान दें कि सी ++ मानक लाइब्रेरी कंटेनर बेस क्लास के लिए डिज़ाइन नहीं किए गए हैं। फ़ंक्शन घोषणा के अंत में – Bathsheba

+0

'const' केवल गारंटी देता है कि फ़ंक्शन को कॉल करने के परिणामस्वरूप कक्षा की स्थिति नहीं बदलेगी। लौटाया गया मूल्य स्थिर नहीं है, और तथ्य के बाद बदला जा सकता है। –

उत्तर

32

ध्यान से vertex.push(vertex[0]); पर विचार करें। t फ़ंक्शन push में vertex[0] का निरंतर संदर्भ है।

लेकिन push_back के बाद, वेक्टर की सामग्री (स्मृति स्मृति पुनर्वितरण के कारण) चली गई है, और इसलिए vector[0] कहीं और स्थानांतरित हो गया है। t अब संदर्भ है।

यह अपरिभाषित व्यवहार है। बूम

+0

यह ध्यान देने योग्य है कि स्पष्ट रूप से 't' को नए आवंटित बैकिंग स्टोर में धक्का दिया गया है _after_ मौजूदा डेटा की प्रतिलिपि बनाई गई है और पुराने बैकिंग स्टोर को हटा दिया गया है। – imallett

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