2015-01-17 8 views
19

मैं एक चर पुनर्व्याख्या पर एक मुद्दा जोड़ सकते हैं और यही कारण है कि मैं नहीं जानता कि ..reinterpret_cast क्वालिफायर

int ProgressBar(const uint64_t data_sent, const uint64_t data_total, void const * const data) { 
    Dialog *dialog = reinterpret_cast<Dialog *>(data); 
    dialog->setValue((data_sent * 100)/data_total); 
} 

reinterpret_cast अनुमति नहीं लगता है और कहते हैं 'स्थिरांक शून्य से

reinterpret_cast * दूर डाले) करने के लिए संवाद * क्वालिफायर

किसी भी विचार दूर डाले

+3

'reinterpret_cast' सीवी-क्वालिफायर दूर डाली नहीं कर सकते –

+0

प्रयास करें संवाद स्थिरांक * स्थिरांक संवाद = reinterpret_cast <संवाद स्थिरांक * स्थिरांक> (डेटा)', ' –

+0

@Nick: कोई पिछले' const' आप में डाल वहाँ है प्रभाव। –

उत्तर

24

निक Strupat के रूप में टिप्पणी में कहा गया है,

reinterpret_cast सीवी-क्वालिफायर

दूर डाली नहीं कर सकते तो तुम reinterpret_cast और const_cast एक साथ उपयोग कर सकते हैं।

Dialog *dialog = const_cast<Dialog*>(reinterpret_cast<const Dialog *>(data)); 
+0

क्या आप सबसे निचले संवाद * प्रकार पर कोई आधार नहीं खो रहे हैं? –

+0

@BradSpencer इसे बदल दिया, धन्यवाद। –

6

तुम भी एक const_cast उपयोग करने के लिए const क्वालिफायर दूर करने के लिए की जरूरत है। इसके अलावा, void * से कास्टिंग static_cast का उपयोग कर सकते हैं, इसे पुन: परिभाषित करने की आवश्यकता नहीं है। उदाहरण के लिए:

Dialog const *dialog = static_cast<Dialog const *>(data); 
Dialog *d2 = const_cast<Dialog *>(dialog); 

हालांकि, यह सुनिश्चित करें कि संवाद वास्तव में एक const वस्तु नहीं है; एक कॉन्स ऑब्जेक्ट को संशोधित करने का प्रयास (संभवतः setValue ऐसा करता है) अपरिभाषित व्यवहार का कारण बनता है।

मैं इस कास्ट की आवश्यकता से बचने के लिए इंटरफ़ेस को ProgressBar पर पुनर्विचार करने का सुझाव दूंगा।

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