2011-01-14 8 views
5

हाय मैं विरासत कोड के माध्यम से ठोकर खा रहा था, और मैं एक व्यापक विधि परिभाषा/घोषणा में आया था। मेरे पास एक शिक्षित अनुमान है कि यह क्या करता है, लेकिन मैं अभी तक 100% निश्चित नहीं हो सकता।इस विधि घोषणा/परिभाषा का क्या अर्थ है? (एक सरणी पास करने के साथ कुछ करने के लिए?)

घोषणा:

const SomeEnumeratedId (&SomeMethod() const)[SOME_CONSTANT_VALUE]; 

परिभाषा

const SomeEnumeratedId (&SomeClass::SomeMethod() const)[SOME_CONSTANT_VALUE] 
{ 
    return someMemberArray; 
} 

मेरे सबसे अच्छा अनुमान है कि यह someMemberArray के लिए एक संदर्भ से गुजर रहा है और यह गारंटी है कि है कि यह आकार SOME_CONSTANT_VALUE की है, लेकिन मैं कभी नहीं देखा है है जैसा कि प्रतीत होता है, विधि घोषणा के बाद [] नोटेशन, और बहुत सारे कोष्ठक हैं।

किसी भी मदद की बहुत सराहना की।

उत्तर

7

यह एक const सदस्य समारोह कोई पैरामीटर लेने और SOME_CONSTANT_VALUEconstSomeEnumeratedId रों की एक सरणी के लिए एक संदर्भ लौटने की घोषणा है।

typedef के साथ समझना आसान लगता है।

typedef const SomeEnumeratedId SomeArrayType[SOME_CONSTANT_VALUE]; 

SomeArrayType& SomeClass::SomeMethod() const 
{ 
    return someMemberArray; 
} 
+0

क्या विधि के बाद [SOME_CONSTANT_VALUE] कॉलिंग फ़ंक्शन को बताता है कि लौटा संदर्भ उस लंबाई की सरणी को संदर्भित करता है? यही वह हिस्सा है जो मुझे सबसे ज्यादा भ्रमित करता है क्योंकि मैंने कभी भी एक समारोह घोषणा में उस हिस्से को नहीं देखा है। मैंने केवल अंत में संदर्भ या पॉइंटर्स के रूप में पारित सरणी देखी हैं। – Michael

+0

@ माइकल: हाँ। यह वापसी प्रकार की घोषणा का हिस्सा है। –

+0

वियर्ड। बहुत धन्यवाद। – Michael

0

कि अजीब अंकन, के रूप में @Charles पहले ही बताया गया है एक निरंतर विधि है कि एक सदस्य के रूप में जमा तत्वों की एक सरणी के लिए एक संदर्भ रिटर्न की घोषणा/परिभाषा है।

वाक्य रचना काफी विचित्र है और (और शायद चाहिए) एक typedef के माध्यम से सरल किया जा सकता है:

typedef SomeEnumerated array_t[SOME_CONSTANT_VALUE]; 
const array_t& SomeMethod() const; 
0

हां, यह सी पूरी तरह से पीछे की ओर प्रकार घोषणा वाक्य रचना का एक परिणाम है। यह समान है कि, जब सरणी टाइपपीफ करते हैं, तो आप इसे लिखते हैं: typedef int myArrayType[3];, नए टाइपनाम के बाद [3] के साथ, मूल नहीं।

तुम सच में चतुर आप {std,tr1,boost}::array का उपयोग कर सकते हैं - ताकि आप के साथ अंत - वैसे भी पर विचार के लायक:

array<SomeEnumeratedId, SOME_CONSTANT_VALUE>& SomeClass::SomeMethod() const; 
बजाय

टाइपपीफ (अन्य उत्तरों में एक्सप्लोर) के साथ कामकाज संबंधित हैं, हालांकि {std,tr1,boost}::array के बराबर नहीं हैं, केवल टाइप किए गए हैं।

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