2013-10-24 16 views
7

मैं एक निजी चर के रूप में परिभाषित किया है:const_cast का उपयोग कैसे करें?

const int studentNumnber; 

मैं एक प्रति निर्माता लिखने की कोशिश कर रहा हूँ और मैं constness यह करने के लिए दूर कास्ट करने के लिए की जरूरत है, दुर्भाग्य से मुझे समझ नहीं आता कैसे const_cast उपयोग करने के लिए।

Student(const Student & s) 
     : Person(p.getName(), p.getEmailAddress(), p.getBirthDate()), school(0),  studentNumber(0){ 
     school = new char[strlen(s.school) +1]; 
     strcpy_s(school, strlen(s.school) +1, s.school); 
     const_cast<int*>(this)->studentNumber = s.studentNumber; 
      //studentNumber= s.studentNumber); 
    } 

यह काम नहीं करता ... मैं वाक्य रचना इस

+0

यह पागल है। 'ई' क्या है? आरंभकर्ता सूची में आपको केवल 'studentNumber (s.StudentNumber) 'होना चाहिए; या इसके बजाय, एक कॉपी कन्स्ट्रक्टर खुद को बिल्कुल लिखें। –

उत्तर

30

आप नहीं कर रहे हैं करने के लिए है कि क्या को लेकर अनिश्चित हूं:

यह वही है मैं अपने प्रति निर्माता में करने के लिए कोशिश कर रहा हूँ है const_cast वेरिएबल्स की अनुमति है जो वास्तव में const हैं। इसका परिणाम अपरिभाषित व्यवहार में होता है। const_cast का संदर्भ संदर्भ और पॉइंटर्स से कॉन्स्ट-नेस को निकालने के लिए किया जाता है जो आखिरकार ऐसा कुछ संदर्भित करता है जो const नहीं है।

तो, यह अनुमति दी है:

int i = 0; 
const int& ref = i; 
const int* ptr = &i; 

const_cast<int&>(ref) = 3; 
*const_cast<int*>(ptr) = 3; 

यह क्योंकि i, वस्तु के लिए निर्धारित किये जाने की अनुमति दी है, const नहीं है। नीचे की अनुमति दी है नहीं:

const int i = 0; 
const int& ref = i; 
const int* ptr = &i; 

const_cast<int&>(ref) = 3; 
*const_cast<int*>(ptr) = 3; 

यहाँ क्योंकि iconst है और आप इसे एक नया मान देकर इसकी संशोधित कर रहे हैं। कोड संकलित होगा, लेकिन इसका व्यवहार अनिर्धारित है (जिसका अर्थ है "यह ठीक काम करता है" से "प्रोग्राम ठीक हो जाएगा"।

आपको उन्हें निर्दिष्ट करने के बजाय निर्माता के प्रारंभकर्ताओं में निरंतर डेटा सदस्यों को प्रारंभ करना चाहिए रचनाकारों का शरीर:

Student(const Student & s) 
    : Person(p.getName(), p.getEmailAddress(), p.getBirthDate()), 
     school(0), 
     studentNumber(s.studentNumber) 
{ 
    // ... 
} 
+0

मैं समझता हूं कि मुझे यह नहीं करना चाहिए, लेकिन दुर्भाग्य से मुझे const_cast का उपयोग करना होगा, इस प्रकार यह असाइनमेंट स्थापित किया गया है। मैं सिर्फ कोड के वाक्यविन्यास को समझ नहीं पा रहा हूं। मुझे पता है कि यह यह है: const_cast < new_type > (अभिव्यक्ति) \t \t लेकिन मुझे यह समझ में नहीं आता है। – Sarah

+2

@ सराह, फिर आपका असाइनमेंट आपको अपरिभाषित व्यवहार का आह्वान करने के लिए मजबूर कर रहा है और परिणाम भिन्न होने पर आपके प्रोफेसर को आश्चर्यचकित नहीं होना चाहिए। ऐसा लगता है कि यह पहली जगह में संकलित है। – chris

+0

@ सराह ने const_cast उपयोग को जोड़ा। – timrau

-1

अपने कोड में आप चर के बजाय इस पॉइंटर को डालने का प्रयास कर रहे हैं। आप निम्नलिखित का प्रयास कर सकते हैं:

Student(const Student & s) 
    : Person(p.getName(), p.getEmailAddress(), p.getBirthDate()), school(0),  studentNumber(0){ 
    school = new char[strlen(s.school) +1]; 
    strcpy_s(school, strlen(s.school) +1, s.school); 
    ***const_cast<int*>(&studentNumber) = s.studentNumber;**    
} 
संबंधित मुद्दे