2013-05-23 8 views
5
blog blog::operator+(const blog * b) 
{ 
    next = b; //blog * next; it's a next pointer in a doubly linked list. 
    return * this; 
} 

पर एक कॉन्स्ट पॉइंटर असाइन करना मैं बस सोच रहा था कि क्या कोई तरीका है कि मैं वर्तमान नोड के अगले सूचक को बी असाइन कर सकता हूं। क्या कोई अलग तरीका है कि मैं इसे कर सकता हूं? अभी मैं अपने नोटों पर वापस देख रहे हैंअमान्य रूपांतरण? एक पॉइंटर

invalid conversion from ‘const blog*’ to ‘blog*’ [-fpermissive] 

हो रही है, यह पता चलता है कि मैं स्थिरांक का उपयोग करना चाहिए, जबकि ऑपरेटर ओवरलोडिंग कर रही है, लेकिन अभी यह वास्तव में संकलन नहीं कर रहा है लगता है। मैं अगले सूचक में कॉन्स ब्लॉग * बी को कैसे डालने में सक्षम हूं? धन्यवाद!

+0

आप क्यों चाहेंगे? आप अपरिभाषित व्यवहार का आह्वान किए बिना स्थिरांक को संशोधित नहीं कर सकते हैं। कास्टिंग और भूलना एक समाधान नहीं है। – chris

+1

आपको तब तक नहीं माना जाता है जब तक कि शैतान और उसके 'const_cast' को बुलाकर नहीं। यदि इस सूचक को उस संदर्भ में 'const' के रूप में चिह्नित किया गया है, तो इसका अर्थ यह है कि इसे संशोधित करने के किसी भी तरीके की अनुमति नहीं देनी चाहिए। – Nbr44

+4

आप अपने ऑब्जेक्ट के लिए _assign_ को मानने के लिए 'ऑपरेटर +' का उपयोग क्यों कर रहे हैं? –

उत्तर

7

आपके प्रश्न और टिप्पणियों से मैं समझता हूं कि आप const blog * के अर्थ के बारे में उलझन में हैं।

आपको पॉइंटर प्रकार पीछे की ओर पढ़ना होगा।

  • blog * ब्लॉग करने के लिए एक सूचक है - आप सूचक बदल सकते हैं, तो आप उठाई-सूचक के साथ वस्तु बदल सकते हैं।
  • blog const * (और const blog *) ब्लॉग के लिए एक सूचक है - आप सूचक मूल्य बदल सकते हैं, लेकिन आप इस सूचक के साथ ऑब्जेक्ट को नहीं बदल सकते हैं।
  • blog * const ब्लॉग के लिए एक कॉन्स पॉइंटर - आप सूचक मूल्य नहीं बदल सकते हैं, लेकिन आप अभी भी इस सूचक के साथ बिंदु-वस्तु को बदल सकते हैं।

भ्रम अक्सर arrises क्योंकि आप दो प्रकार है कि यहाँ खेलने के लिए आए हैं। पॉइंटर और पॉइंट-टू टाइप का प्रकार। दोनों कॉन्स हो सकते हैं।

अपने operator+ के इंटरफ़ेस के साथ आप गारंटी देते हैं कि पैरामीटर द्वारा इंगित ऑब्जेक्ट उस पॉइंटर (कॉन्स ब्लॉग को पॉइंटर) द्वारा नहीं बदला जाएगा। लेकिन फिर आप इसे ब्लॉग के लिए एक सूचक को असाइन करते हैं, जिसका उपयोग ऑब्जेक्ट को बदलने और इंटरफ़ेस अनुबंध को तोड़ने के लिए किया जा सकता है। मेरा सुझाव है कि आप इंटरफेस पर पुनर्विचार करें या अपने ऑपरेटर के कार्यान्वयन को बदलें - हो सकता है कि आप पॉइंटर्स के साथ छेड़छाड़ करने की बजाय, आंतरिक सूची में ऑब्जेक्ट की सामग्री की प्रतिलिपि बनाना चाहें।

+1

से पहले टाइप-विनिर्देशक के बाद एक कॉन्स का उपयोग नहीं किया है, आप यह भी जोड़ सकते हैं कि 'कॉन्स ब्लॉग *' और 'ब्लॉग कॉन्स *' समान हैं (विशेष रूप से बाद वाले "पीछे के प्रकार को पढ़ने के करीब") – Joe

+0

True , मैं इसे – Fiktik

+0

पर संपादित करूँगा बिल्कुल सही! मैं उलझन में आया क्योंकि मुझे पता था कि कॉन्स ब्लॉग * और ब्लॉग कॉन्स * एक ही बात थी, लेकिन जब मैंने ब्लॉग * कॉन्स देखा जो वास्तव में मुझे उलझन में डाल दिया! यह साफ़ हो गया है, बहुत बहुत धन्यवाद! – ZZPLKF

0

यदि आप वास्तव में अपने वर्ग के लिए सामान्य अर्थ और उपयोग से अलग ऑपरेटर + अधिभार करना चाहते हैं, तो आपको वास्तव में अपने पैरामीटर को कॉन्स्ट के रूप में घोषित करने की आवश्यकता नहीं है। कि जिस तरह से साथ आप अपनी समस्या

0

से निपटने कर सकते हैं आप next = const_cast<blog *>(b)

const_cast उपयोग कर सकते हैं हटाने या चर के constantness दूर डाली जाएगी।

1

यदि आप वास्तव में गैर-कॉन्स्ट पॉइंटर में कॉन्स्ट पॉइंटर डालना चाहते हैं तो आप गौर के अनुसार const_cast का उपयोग कर सकते हैं।

हालांकि, मैं ऐसा कुछ उपयोग करता हूं जैसे कि आखिरी उपाय के रूप में जब मैं वास्तव में किसी और के lib/api द्वारा cornered करता हूं तो मुझे बस उपयोग करना पड़ता है।

यदि यह अपने कोड में हुआ है इस ususally मतलब है कि आप अपने एपीआई/इंटरफेस ध्यान से डिजाइन और/या दुरुपयोग/गलत "स्थिरांक शुद्धता"

मैं दृढ़ता से आप const correctness के बारे में पढ़ने के लिए enourage नहीं कर रहे हैं।

अद्यतन: कॉन्स कोरक्टेनेस सी ++ में हमारे पास एक और फैंसी चीज नहीं है। यह कभी-कभी कुछ दर्द जोड़ सकता है, लेकिन यह आपके कोड के ग्राहकों के साथ-साथ कंपाइलर/ऑप्टिमाइज़र को धारणाओं के लिए कुछ जगह भी प्रदान करता है। const_cast सचमुच "नियमों को तोड़ता है" और आसानी से अप्रत्याशित व्यवहार का कारण बन सकता है।

0

अपने नोट्स शायद द्विआधारी ऑपरेटर ओवरलोडिंग के सामान्य मामले में, जहां दो ऑपरेंड में परिवर्तन नहीं करते की बात कर रहे है जैसे आप अधिक भार गया + या

इस तरह के (वे सिर्फ एक परिणाम बनाने के लिए उपयोग किया जाता है) - के लिए अंकगणितीय परिचालन करें।

आपका पैरामीटर किसी ऑब्जेक्ट के लिए एक सूचक है जिसे बदलने की अनुमति नहीं है, अब आपके पास एक लिंक की गई सूची है जहां क्लास में नोड डेटा संग्रहीत किया जाता है, यह वही नहीं है जो आप सूची बदलते हुए बदलते हैं वस्तुओं।

आपकी त्रुटि को सही करने के लिए एक कास्ट का उपयोग करके आपको पैरामीटर कॉन्स बनाने के उद्देश्य को आसानी से नष्ट कर देता है, तो आप इसे केवल स्थिर नहीं बना सकते हैं, जो कि आप जो कर रहे हैं उसके लिए शायद ठीक है।

ऑपरेटर अधिभार केवल कार्य हैं, कोई अन्य कठिन कार्य नहीं है, जो कि मैं देख सकता हूं कि किसी भी अन्य कार्यों की तुलना में अधिक स्थिर होना चाहिए।

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