2011-02-15 17 views
18

मैं एक विरासत समारोह है कि इस तरह दिखता है के भीतर एक गैर स्थिरांक समारोह कॉल करने के लिए:कैसे एक स्थिरांक समारोह (C++)

int Random() const 
{ 
    return var_ ? 4 : 0; 
} 

और मैं तो यह है कि अब कि विरासत कोड के भीतर एक समारोह कॉल करने की आवश्यकता इस तरह दिखता है:

int Random() const 
{ 
    return var_ ? newCall(4) : 0; 
} 

समस्या यह है कि मैं इस त्रुटि हो रही है:

In member function 'virtual int Random() const': 
class.cc:145: error: passing 'const int' as 'this' argument of 'int newCall(int)' discards qualifiers 

अब मुझे पता है क्रम में थी ठीक करने के लिए एस त्रुटि मैं अपने newCall() एक कॉन्स फ़ंक्शन कर सकता हूं। लेकिन फिर मेरे पास newCall() में कई funciton कॉल हैं जो मुझे करना है, इसलिए अब मुझे उन सभी फ़ंक्शन कॉल कॉन्स्ट करना होगा। और इतने पर और आगे तक जब तक मुझे लगता है कि आधा मेरा कार्यक्रम नहीं होगा।

मेरा प्रश्न: क्या यादृच्छिक() के भीतर कोई फ़ंक्शन कॉल करने का कोई तरीका है जो स्थिर नहीं है? या किसी के पास को Random() के भीतर आधे प्रोग्राम प्रोग्राम के बिना लागू करने के बारे में कोई विचार है।

धन्यवाद

-josh

+0

आप रैंडम() गैर-कॉन्स बना सकते हैं। – GWW

+0

मैं चाहता हूं कि रैंडम() विरासत कोड है जिसे मैं वास्तव में स्पर्श नहीं कर सकता। – Grammin

+1

क्या वह 4 निष्पक्ष पासा के साथ चुना गया है (इस प्रकार यह वास्तव में यादृच्छिक बना रहा है)। –

उत्तर

17

आप चाहिए उपयोग करने के लिए/सही ढंग से स्थिरांक की घोषणा ...

एक विकल्प const_cast उपयोग करने के लिए है अपने कार्यक्रम में परिवर्तन।

+2

+1: यदि आप कर सकते हैं, तो उन सभी निर्भर कार्यों 'const' बनाओ। –

+5

गलत तरीके से const_cast का उपयोग करना (जो सुनता है) एक संपूर्ण आपदा का कारण बन जाएगा। –

+3

सलाह के लिए धन्यवाद, मैंने नए कॉल() और newCall() के नीचे दिए गए कार्यों को बदल दिया है, क्योंकि मैं गहन रूप से कॉन्स्ट का उपयोग नहीं करना चाहता था। – Grammin

0
const_cast<MyClass *>(this)->newCall(4) 

केवल यह कर यदि आप कुछ newCall में बदलाव नहीं करेगी "इस" कर रहे हैं।

12
int Random() const 
{ 
    return var_ ? const_cast<ClassType*>(this)->newCall(4) : 0; 
} 

लेकिन यह एक अच्छा विचार नहीं है। अगर यह संभव है से बचें!

+1

@ डाउनवॉटर: कृपया बताएं कि क्यों डाउनवोट? – Nawaz

+0

जैसा आपने कहा था, अगर आपको इसे पूरा करने के लिए वास्तव में 'const_cast' का उपयोग करने की आवश्यकता है, तो अपने डिज़ाइन को दोबारा करने का प्रयास करें। – thatWiseGuy

0

कॉन्स कास्ट के बिना, क्या आप Random() विधि में कक्षा का एक नया उदाहरण बनाने का प्रयास कर सकते हैं?

0

const क्वालीफायर दावा करता है कि कक्षा के उदाहरण this ऑपरेशन के बाद अपरिवर्तित होगा, जो कुछ संकलक स्वचालित रूप से कटौती नहीं कर सकता है।

const_cast इस्तेमाल किया जा सकता है, लेकिन इसके बुराई

1

यहाँ दो संभावनाएं हैं। सबसे पहले, newCall और इसके सभी कॉलि वास्तव में गैर-संशोधित फ़ंक्शन हैं। उस स्थिति में आपको पूरी तरह से जाना चाहिए और उन्हें सभी const चिह्नित करना चाहिए। कोड और पढ़ने के लिए इसे और अधिक आसान बनाने के लिए आप और भविष्य कोड कोडर दोनों आपको धन्यवाद देंगे (व्यक्तिगत अनुभव से बोल रहे हैं)। दूसरा, newCall वास्तव में आपके ऑब्जेक्ट की स्थिति को बदल देता है (संभवत: इसे कॉल किए गए कार्यों में से एक के माध्यम से)। इस मामले में, आपको एपीआई तोड़ने और Random गैर-कॉन्स को सही ढंग से कॉल करने वालों को इंगित करने की आवश्यकता है कि यह ऑब्जेक्ट स्थिति को संशोधित करता है (यदि संशोधन केवल भौतिक स्थिरता को प्रभावित करते हैं और तार्किक स्थिरता नहीं है तो आप उत्परिवर्तनीय गुणों का उपयोग कर सकते हैं और const प्रचारित कर सकते हैं)।

0

यदि यह वास्तव में एक यादृच्छिक संख्या जनरेटर है, तो संख्या पीढ़ी कोड/राज्य को कक्षा-स्थानीय स्थैतिक जनरेटर में रखा जा सकता है। इस तरह, आपकी वस्तु उत्परिवर्तित नहीं होती है और विधि स्थिर रह सकती है।

+0

यह एक यादृच्छिक संख्या जनरेटर नहीं है, मुझे बस SO के लिए एक उदाहरण की आवश्यकता है। फिर भी आपका धन्यवाद – Grammin