2015-04-16 12 views
7

के माध्यम से अन्य वर्ग 'कॉन्स्ट सदस्य फ़ंक्शन को कैसे कॉल करें मानक पुस्तकालय (दस्तावेज़ संख्या N4388) में एक कॉन्स्ट-प्रोपेगेटिंग रैपर जोड़ने के प्रस्ताव के बारे में पढ़ने के दौरान, मैंने दिए गए उदाहरण में टक्कर लगी कागज:एक कक्षा :: unique_ptr सदस्य

#include <memory> 
#include <iostream> 

struct A 
{ 
    void bar() const 
    { 
     std::cout << "A::bar (const)" << std::endl; 
    } 

    void bar() 
    { 
     std::cout << "A::bar (non-const)" << std::endl; 
    } 
}; 

struct B 
{ 
    B() : m_ptrA(std::make_unique<A>()) {} 

    void foo() const 
    { 
     std::cout << "B::foo (const)" << std::endl; 
     m_ptrA->bar(); // calls A::bar() (non-const) 

     // const_cast<const std::unique_ptr<A>>(m_ptrA)->bar(); // how to call the A::bar() const? 
    } 

    void foo() 
    { 
     std::cout << "B::foo (non-const)" << std::endl; 
     m_ptrA->bar(); 
    } 

    std::unique_ptr<A> m_ptrA; 
}; 

int main() 
{ 
    const B const_b; 
    const_b.foo(); 
} 

जो आउटपुट:

बी :: foo (स्थिरांक)
एक :: बार (गैर स्थिरांक)

मुझे समझ में आता है कि ऐसा क्यों होता है। यहां तक ​​कि यदि सूचक const है, तो ऑब्जेक्ट यह इंगित करता है कि गैर-कॉन्स सदस्य A::bar कहा जाता है (यह पेपर में प्रस्ताव का पूरा बिंदु है, यह प्रतीत होता है कि यह अजीब स्थिति से बचने और const प्रसारित करने के लिए एक रैपर के माध्यम से)। इसके अलावा, वे कहते हैं कि इस स्थिति से बचने के लिए, const_cast सूचक m_ptrAB::foo() const में, इसलिए यह वांछित A::bar() const पर कॉल कर सकता है।

मैंने अनगिनत संयोजनों की कोशिश की लेकिन स्पष्ट रूप से मुझे नहीं पता कि const_castunique_ptr कैसे करें। अर्थात् m_ptrA के माध्यम से A::bar() const पर "दाएं" कॉल को B::foo() const में कैसे लागू किया जा सकता है? (कोड में टिप्पणी भी देखें यदि यह पूरी तरह स्पष्ट नहीं है कि मैं क्या चाहता हूं)।

+2

'static_cast (* ptr) .method()' –

उत्तर

5

आप स्थिरांक-कास्ट करने के लिए जमा हो जाती सूचक, नहीं unique_ptr की जरूरत है:

const_cast<const A*>(m_ptrA.get())->bar(); 
const_cast<const A&>(*m_ptrA).bar(); 
+0

धन्यवाद, यह वास्तव में काम करता है। किसी कारण से मैंने सोचा कि मैं सीधे 'पॉइंट_प्टर' के लिए 'static_pointer_cast' के समान स्मार्ट पॉइंटर पर 'const_cast' का उपयोग कर सकता हूं। लेकिन आपका समाधान शायद एकमात्र तरीका है। स्मार्ट पॉइंटर पर – vsoftco

+0

@vsoftco 'const_cast' स्मार्ट पॉइंटर की स्थिरता को बदलता है लेकिन स्मार्ट पॉइंटर का 'ऑपरेटर ->' और 'ऑपरेटर *' लौटा ऑब्जेक्ट के लिए स्थिरता को संरक्षित नहीं करता है। यह नकल करता है कि कच्चे पॉइंटर्स कैसे व्यवहार करते हैं। यदि आपको कॉन्स्ट-संरक्षित पॉइंटर की आवश्यकता है, तो आप [इस कार्यान्वयन] (http://stackoverflow.com/a/21065654/4538344) का उपयोग कर सकते हैं। – StenSoft

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