पर विचार करें:
#include <cstdlib>
class Bar {};
class Foo
{
public:
Foo (Bar& bar)
:
mBar (bar)
{
}
const Bar& get() const
{
return mBar;
}
private:
Bar& get()
{
return mBar;
}
Bar& mBar;
};
int main()
{
Bar bar;
Foo foo (bar);
Bar& ref = foo.get();
}
कॉल के समय: const Bar& ref = foo.get();
आप क्योंकि आप एक const
संदर्भ बताए जाते हैं उम्मीद कर सकते हैं get()
की const
संस्करण के नाम से जाना,।
लेकिन ऐसा नहीं है। रिटर्न प्रकार फ़ंक्शन (या विधि) हस्ताक्षर का हिस्सा नहीं हैं, इसलिए जब संकलक संभावित अधिभार की सूची में कॉल करने के लिए कौन सा फ़ंक्शन ढूंढ रहा है, तो वापसी प्रकार पर विचार नहीं किया जाता है। (वास्तव में, मानक फ़ंक्शन ओवरलोड को अस्वीकार करता है जो केवल रिटर्न प्रकार से भिन्न होता है।)
तो, संकलक किस निर्णय को कॉल करने का निर्णय लेता है? जानकारी को देखकर यह उपलब्ध है। Tweo अधिभार पैरामीटर के मामले में समान हैं (दोनों void
हैं), इसलिए केवल एक चीज जिस पर जाना है, कॉल करने के लिए उपयोग की जाने वाली वस्तु का स्थिर प्रकार है: foo
। इस मामले में वह स्थिर प्रकार Foo
है - निश्चित रूप से गैर- const
।
इसलिए इसने केवल एकमात्र फ़ंक्शन को कॉल करने का प्रयास किया: गैर-const
get()
का संस्करण। निश्चित रूप से संकलित नहीं होगा क्योंकि यह private
है।
लोमड़ी इस करने के लिए, स्थिर प्रकार एक const Foo
(या कुछ इसी तरह), इस तरह बदला जा सकता है:
Foo foo (bar);
Bar& ref = foo.get();
या हो सकता है ...
Foo foo (bar);
const Bar& ref = static_cast <const Foo&> (foo).get();
लेकिन में अभ्यास, मैं सलाह दूंगा कि इन कार्यों के नाम अनौपचारिक हों, बल्कि आप जो चाहते हैं उसे करने के लिए कंपाइलर को विपरीत बनाने के लिए इस तरह के "चाल" पर भरोसा करते हैं।
स्रोत
2013-06-12 14:19:10
.... const * navtmpmesh = navmesh; navmesg-> getTile (i); काम? – UldisK
'const_cast (navmesh) -> getTile();' –
BoBTFish
अगर मुझे गलत नहीं लगता है, तो कौन सा फ़ंक्शन कंपाइलर कॉल करने का विकल्प चुनता है, कभी भी रिटर्न प्रकार द्वारा तय नहीं किया जाता है (यही कारण है कि आप int foo नहीं कर सकते (int) और शून्य फू (int))। क्या आपने नेस्टेस को किसी कॉन्स्ट ऑब्जेक्ट में पॉइंटर पर कास्टिंग करने का प्रयास किया है? इसके अलावा, तथ्य यह है कि आपको "सही" फ़ंक्शन चुनने से निपटने के लिए एक कलाकार की आवश्यकता है, इसका मतलब है कि आपको अपने एपीआई को फिर से काम करने की आवश्यकता है। –