2009-03-26 22 views
11

मैं const MyClass * const के रिटर्न प्रकार का उपयोग करने की कोशिश कर रहा हूं। हालांकि, मुझे चेतावनी मिलती है:मेरा रिटर्न टाइप अर्थहीन क्यों है?

चेतावनी: # 815-डी: रिटर्न प्रकार पर क्वालीफायर टाइप व्यर्थ है।

क्या यह वैध प्रकार नहीं है? मैं चाहता हूं कि एक पॉइंटर बदला जा सके, और मैं चाहता हूं कि वह चीज़ जो भी बदली न हो, उसे बदलना न पड़े।

+0

आप किस कंपाइलर और संकलन झंडे का उपयोग कर रहे हैं? – Trent

+1

आरवीसीटी 3.1 और मुझे नहीं पता कि निर्माण प्रणाली झंडे के झटके क्या हैं, हम केवल हमारे प्राणियों से छिपाए गए हैं – Dynite

उत्तर

22

सूचक ही मान प्रकार है लौट रहे हैं, तो यह मतलब नहीं है यह स्थिरांक बनाने के लिए। लौटाए गए मूल्य के साथ कॉलर फ़ंक्शन क्या कॉल किए गए फ़ंक्शन द्वारा प्रतिबंधित नहीं किया जा सकता है। इस मामले में, बस एक पूर्णांक मूल्य (नहीं एक संदर्भ) रिटर्न)

const int getInt(); 

getInt (: कुछ इस तरह परिभाषित करने की कोशिश कर के लिए समान है। यह एक रजिस्टर में जाता है, फिर कॉलर फ़ंक्शन इसे प्राप्त करता है और जो कुछ भी चाहता है वह करता है।

+0

तो मूल रूप से आप केवल संदर्भों के साथ कॉन्स्ट रिटर्न प्रकार परिभाषित कर सकते हैं? – Dynite

+0

हां (संदर्भ के अनुसार, दोनों संदर्भ और बिंदु वस्तुओं का अर्थ है)। पॉइंटर स्वयं का आधार नहीं हो सकता है, यह सिर्फ एक मूल्य प्रतिलिपि है। – Juliano

+0

फ़ंक्शन से लौटाए जाने पर पॉइंटर कॉन्स्ट नहीं हो सकता है, लेकिन आपके पास कॉल साइट पर एक कॉन्स पॉइंटर हो सकता है (नीचे मेरा उत्तर देखें)। जब आप वास्तव में सूचक का उपयोग कर रहे हों तो यह किसी को अनजाने में एक पॉइंटर पर पुन: असाइन करने से रोकता है। –

0

स्थिरांक क्वालीफायर कुछ भी मतलब नहीं है क्योंकि आप एक सूचक

4

पॉइंटर बदलने के बाद आपको परवाह क्यों है? ऐसा करने से यह कहते हुए की तरह है:

const int f() { 
    ... 
} 

च द्वारा दिए गए मान() एक प्रति है - यह कुछ भी नहीं बदलता है बदल रहा है, इसलिए वहाँ यह स्थिरांक बनाने में nom बिंदु है।

+0

मैं सोच रहा था कि मैं नहीं चाहता कि लोग पॉइंटर ++ की तरह कुछ कर रहे हों, क्योंकि प्रत्येक व्यक्तिगत वस्तु का आकार समान नहीं है। – Dynite

+3

@Dynite, यह लोगों को आपका पता देने जैसा है, उदाहरण के लिए 80, मेन स्ट्रीट, और फिर सोच रहा है कि क्या होगा यदि वे 81, मेन स्ट्रीट पर घंटी बजते हैं। –

+0

@Dynite - जैसा कि डैनियल बताता है, वे इसे वैसे भी कर सकते हैं, इसलिए आपको कुछ अतिरिक्त कीबोर्ड अभ्यास –

4

यह सुनिश्चित करने का एक आसान तरीका है कि आप जिस प्रकार के रिटर्न प्रकार को परिभाषित कर रहे हैं उसे परिभाषित करना है, हमेशा मूल प्रकार के दाएं (बाईं ओर के विपरीत) को संशोधित करना है।

MyClass     // MyClass object 
MyClass const   // MyClass object which can't be modified 
MyClass const &   // reference of an unmodifiable MyClass object 
MyClass const *   // pointer to an unmodifiable MyClass object 
MyClass const * const // unmodifiable pointer to an unmodifiable MyClass object 
MyClass const * const & // reference of an unmodifiable pointer to an unmodifiable MyClass object 

मदद करनी चाहिए यही कारण है कि यकीन है कि अपनी वापसी प्रकार व्यर्थ कभी नहीं कर रहे हैं फिर से :)

+1

प्रश्न से: "पॉइंटर को बदला नहीं जा सकता है, और ... जिस चीज को यह इंगित करने के लिए इंगित नहीं किया जाता है।" उन्होंने वापसी के प्रकार को उनके इरादों के आधार पर सही तरीके से घोषित किया। – Trent

+0

हां, उसने किया। और उसे वापसी मूल्य पर इस सामान के अर्थहीन के बारे में केवल एक संकलक चेतावनी मिली। – dragonfly

5

मैं पीटर के जवाब से सहमत हैं, आप सूचक की constness कॉल स्थल पर होना चाहता हूँ।

के लिए अपने कार्य ऑब्जेक्ट में एक स्थिरांक संदर्भ लौटने के लिए है कि आप क्या देख रहे हैं करने के लिए एक बेहतर तरीका:

const MyClass& getMyClass() 
{ 
    return myClass; 
} 

परिभाषा संदर्भ द्वारा बदला नहीं जा सकता है, तो आप बेहतर बंद हो जाएगा ।

बेशक यह काम नहीं करेगा यदि आपका फ़ंक्शन एक MyClass ऑब्जेक्ट बना रहा है। उस स्थिति में आप अतिरिक्त कॉन्स को कॉल साइट पर ले जा सकते हैं।

// function definition 
const MyClass* createMyClass() 
{ 
    return new MyClass("I Love C++"); 
} 

// use of a const pointer to a MyClass which is const 
const MyClass* const myClassInstance = creatMyClass(); 
0

एक कॉन्स वैल्यू क्यों लौटाएं? निम्नलिखित पर विचार करें (और कृपया ख़याल से बाहर चर नाम बहाना):

struct A { int a; }; 

A operator+(const A& a1, const A& a2) 
{ 
    A a3 = { a1.a + a2.a }; 
    return a3; 
} 

operator+ की घोषणा को देखते हुए, मैं निम्नलिखित कर सकते हैं:

A a = {2}, b = {3}, c = {4}, d = ((a+b) = c); 

यह सही है, मैं सिर्फ अस्थायी A करने के लिए सौंपा है कि operator+ द्वारा वापस किया गया था। d.a का परिणामी मान 4 है, 5 नहीं।operator+ से const A के रिटर्न प्रकार को बदलने से इस असाइनमेंट को रोकता है, जिससे एक संकलक त्रुटि उत्पन्न करने के लिए (a+b) = c अभिव्यक्ति उत्पन्न होती है।

यदि मैं किसी फ़ंक्शन से लौटाए गए पॉइंटर या पूर्णांक को असाइन करने का प्रयास करता हूं, तो मेरा कंपाइलर (एमएसवीसी) "बाएं ऑपरेंड एल-वैल्यू होना चाहिए" त्रुटि उत्पन्न करता है, जो एआरएम कंपाइलर के साथ संगत लगता है जो आपको बताता है कि सूचक अर्थहीन है - सूचक को वैसे भी असाइन नहीं किया जा सकता है। लेकिन कक्षाओं/structs के लिए, स्पष्ट रूप से गैर-कॉन्स रिटर्न मूल्यों को असाइन करना ठीक है।

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