2013-06-12 6 views
5

मैं हेडर इस तरह के साथ एक वर्ग हैसार्वजनिक कॉन्स निजी कॉन्स फ़ंक्शन को ओवरराइड नहीं करता है? जब मैं इस तरह इसका इस्तेमाल करने की कोशिश</p> <pre><code>public: const dtMeshTile* getTile(int i) const; private: dtMeshTile* getTile(int i); </code></pre> <p>:

const dtMeshTile* const tile = navmesh->getTile(i); 

मैं एक हो रही है " 'dtMeshTile * getTile (int)' है इस संदर्भ में निजी "मैं सार्वजनिक कार्य कैसे निर्दिष्ट कर सकता हूं?

+4

.... const * navtmpmesh = navmesh; navmesg-> getTile (i); काम? – UldisK

+5

'const_cast (navmesh) -> getTile();' – BoBTFish

+2

अगर मुझे गलत नहीं लगता है, तो कौन सा फ़ंक्शन कंपाइलर कॉल करने का विकल्प चुनता है, कभी भी रिटर्न प्रकार द्वारा तय नहीं किया जाता है (यही कारण है कि आप int foo नहीं कर सकते (int) और शून्य फू (int))। क्या आपने नेस्टेस को किसी कॉन्स्ट ऑब्जेक्ट में पॉइंटर पर कास्टिंग करने का प्रयास किया है? इसके अलावा, तथ्य यह है कि आपको "सही" फ़ंक्शन चुनने से निपटने के लिए एक कलाकार की आवश्यकता है, इसका मतलब है कि आपको अपने एपीआई को फिर से काम करने की आवश्यकता है। –

उत्तर

3

पर विचार करें:

#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

इसलिए इसने केवल एकमात्र फ़ंक्शन को कॉल करने का प्रयास किया: गैर-constget() का संस्करण। निश्चित रूप से संकलित नहीं होगा क्योंकि यह private है।

लोमड़ी इस करने के लिए, स्थिर प्रकार एक const Foo (या कुछ इसी तरह), इस तरह बदला जा सकता है:

Foo foo (bar); 
Bar& ref = foo.get(); 

या हो सकता है ...

Foo foo (bar); 
const Bar& ref = static_cast <const Foo&> (foo).get(); 

लेकिन में अभ्यास, मैं सलाह दूंगा कि इन कार्यों के नाम अनौपचारिक हों, बल्कि आप जो चाहते हैं उसे करने के लिए कंपाइलर को विपरीत बनाने के लिए इस तरह के "चाल" पर भरोसा करते हैं।

+0

+1। –

+0

बहुत अच्छी व्याख्या के लिए धन्यवाद। आपने जो कुछ भी उलझन में था, उस पर आपने छुआ। – mpellegr

1

सुनिश्चित करें कि आपके कॉल के संदर्भ में navmesh const Const है। लेकिन मैं इसे const_cast की अनुशंसा नहीं करता, आप इसे http://www.parashift.com/c++-faq/overview-const.html पढ़ सकते हैं।

+0

इस मामले में आप 'const_cast' के खिलाफ क्यों हैं? यह शायद पूरी समस्या का सबसे अच्छा समाधान नहीं है, लेकिन सही कार्य को कॉल करने का यह एक उचित तरीका है। कार्यों के नाम बदलने के लिए – BoBTFish

1

आप एक सुंदर आम डिजाइन प्रवाह से प्रभावित होते हैं - मिश्रित अर्थशास्त्र के साथ एक अधिभार सेट। लेकिन मुझे लगता है कि आप कक्षा को नहीं बदल सकते हैं, केवल इसके आसपास काम करते हैं।

आपकी समस्या अधिभार समाधान नियमों से आती है। समारोह तर्कों के आधार पर चुना जाता है। केवल। इस चरण में निजी/सार्वजनिक सामान को नजरअंदाज कर दिया जाता है। चयन पहले के प्रकार के आधार पर होता है -> यदि यदि यह टी * है, तो पहला कार्य टी * दूसरे के लिए चुना जाता है।

आकलन जांच लागू होती है, इसलिए बाद के मामले में आपको त्रुटि रिपोर्ट मिलती है।वांछित समारोह बाध्य करने के लिए आप बेहतर एक नि: शुल्क आवरण समारोह

const dtMeshTile* getXXXTile(const XXX* p, int i) {return p->getTitle(i);} 

(या एक रेफरी लेने संस्करण) बनाने के एक डाली का उपयोग करना चाहिए, या।

मेरे कोडबेस में दूसरे फ़ंक्शन का एक अलग नाम होगा, क्योंकि एक परिवर्तनीय स्ट्रिंग प्राप्त करना अर्थशास्त्र में अलग है।

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

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