2014-05-12 12 views
5

पर गैर-कॉन्स्ट क्लास फ़ंक्शन को कॉल करने से कॉन्स्ट क्लास फ़ंक्शन को रोकें, सुंदर अस्पष्ट शीर्षक के लिए क्षमा करें, लेकिन यह सब कुछ कहता है। यह मैं क्या मतलबसंदर्भ सदस्य

class A 
{ 
    void DoSomething(); // non-const 
} 
Class B 
{ 
public: 
    B(A& a) : _a(a) { } 
    // const function 
    void DoSomethingElse() const 
    { 
     // Is there a way to disallow this? 
     _a.DoSomething(); 
    } 
    void DoEvenMore() 
    { 
     // Should be OK 
     _a.DoSomething(); 
    } 
private: 
    // Can't make it const A& because it needs 
    // be non-const for non-const functions 
    A& _a; // A reference 
} 

तो वहाँ एक तरह से मैं A::DoSomething() कॉल करने से रोका जा सकता है B::DoSomethingElse() है?
हालांकि, B::DoEventMore() जो const नहीं है, कॉल करने में सक्षम होना चाहिए।

मैं विज़ुअल सी ++ उपयोग कर रहा हूँ 2013

कोड ऊपर मेरी कार्यक्रम में एक बग का प्रदर्शन होगा। (मेरे परिदृश्य में कक्षा ए कॉलिंग कोड की ऑब्जेक्ट/this पॉइंटर को उतार देगा।) क्योंकि इस तरह की त्रुटियों को रोकने के लिए कॉन्स्ट-कॉन्फ़िगरेशन का बिंदु होगा, मैं बस सोच रहा था कि संकलन समय पर इसकी जांच करने का कोई तरीका है या नहीं।

आवेदन में मैं लिख रहा हूं कि समारोह कॉल करने के लिए खतरनाक प्रतीत नहीं होता है। DoEvenMore() से इसे कॉल करते समय परिणाम वही होगा, सिवाय इसके कि B का विनाश तब तक स्थगित हो जाता है जब तक कि कार्य पूरा नहीं हो जाता है।

उत्तर

9

_a डेटा सदस्य का उपयोग करने के बजाय सीधे const और गैर-const ओवरलोड के साथ एक्सेसर फ़ंक्शंस बनाएं। constB के सदस्य फ़ंक्शंस के भीतर से कॉल किए जाने पर const अधिभार का चयन किया जाएगा, जो बदले में आपको A के गैर-const कार्यों को कॉल करने से रोकता है।

A const& GetA() const { return _a; } 
A& GetA() { return _a; } 


void DoSomethingElse() const 
{ 
    GetA().DoSomething(); // error 
} 
+0

धन्यवाद, यही वह है जिसे मैं ढूंढ रहा था। इसे अंतर्निहित बनाने का कोई तरीका नहीं है, है ना? (कॉल को छोड़ना।) – Aidiakapi

+0

@ एडियाकापी यदि आपका मतलब है '_a' तक सीधे पहुंचकर, तो नहीं, ऐसा नहीं है। चूंकि '_a' स्वयं 'const' नहीं है, इसलिए आप इसका उपयोग करके गैर-'const' सदस्य फ़ंक्शंस को कॉल करने के लिए स्वतंत्र हैं। – Praetorian

+0

उत्तर के लिए ठीक है धन्यवाद। – Aidiakapi

5

"स्थिरता" के नियम वस्तु को अपरिवर्तनीय बनाते हैं लेकिन इंगित/निर्दिष्ट वस्तुओं की स्थिरता को प्रभावित नहीं करते हैं। यदि आप const संदर्भ केवल तक पहुंचना चाहते हैं, तो आप const विधि का उपयोग करते हैं, तो आपको कॉन्स्टनेस पर अधिभारित एक विधि बनाने की आवश्यकता होती है जो या तो संदर्भ या कॉन्स्ट संदर्भ देता है।

class B { 
private: 
    inline A& a() { return _a; } 
    inline const A& a() const { return _a; } 
public: 
    // ... 
}; 
संबंधित मुद्दे