2013-02-20 69 views
6

आज मैंने खुद को 2 इट्स की स्थिर सरणी बना दी, और क्योंकि इसकी इनलाइन इनटाइलाइजेशन को सी ++ (सी ++ 11 नहीं) में अनुमति नहीं है, मैं टाइप स्ट्रक्चर के स्थिर चर का उपयोग करने के लिए वापस लौटा।स्थैतिक सदस्यों के साथ स्टेटिक स्ट्रक्चर

class MyWidget { 
    ... 
    static const struct Margin { 
    const int horizontal = 1; 
    const int vertical = 1; 
    } margin; 

}; 

मैंने देखा कि आंतरिक चर का उपयोग केवल संरचना मार्जिन के सभी उदाहरणों के लिए किया जाता है, इसलिए मैंने उन्हें स्थैतिक बनाने का भी फैसला किया।

class MyWidget { 
    ... 
    static const struct Margin { 
    static const int horizontal = 1; 
    static const int vertical = 1; 
    } margin; 

}; 

मुझे क्या चमत्कार बनाम स्थिर सदस्यों के साथ एक स्थिर struct चर एक स्थिर struct चर घोषित करने के बीच अंतर है। एएफएसी स्थैतिक वस्तुओं को स्मृति में केवल एक बार आवंटित किया जाता है, इसलिए मार्जिन स्ट्रक्चर केवल एक बार आवंटित किया जाएगा चाहे मेरे सदस्य स्थिर हों या नहीं।

क्या मुझे कुछ याद आती है? क्या कोई अंतर मौजूद है या क्या यह केवल सिंटैक्टिक चीनी है?

+8

सी ++ में "स्थैतिक संरचना" जैसी कोई चीज़ नहीं है, स्थिर एक भंडारण-श्रेणी-विनिर्देशक है और वेरिएबल या फ़ंक्शंस पर लागू होता है, प्रकार नहीं। – PlasmaHH

+0

आपको नामित सदस्यों के साथ एक संरचना का उपयोग करने के बजाय वापस नाम वापस नहीं करना चाहिए बल्कि अनाम तत्वों की एक सरणी है .. यह दूसरी तरफ होना चाहिए .. –

+0

मैंने थोड़ी देर के लिए googled किया है, और मुझे सार्थक परिणाम नहीं मिल रहे हैं "स्थैतिक structs"। क्या आप शायद सी # दुनिया से आ रहे हैं? – antonijn

उत्तर

8

आप "स्थैतिक structs" के बारे में थोड़ा उलझन में प्रतीत होते हैं, क्योंकि सी ++ में, स्थिर संरचनाओं जैसी कोई चीज नहीं है (सी # जैसी भाषाओं के विपरीत, जहां स्थिर वर्ग इस तथ्य के लिए एक कामकाज हैं कि कोई नहीं है वैश्विक कार्यों)।

आप क्या कर रहे हैं, उस वर्ग का एक उदाहरण बना रहा है, और उदाहरण (margin) स्थैतिक (और स्थिर) बना रहा है। तो आपकी संरचना स्थैतिक नहीं है, आप बस एक संरचना को परिभाषित कर रहे हैं, और MyWidget से संबंधित static const उदाहरण बना रहे हैं। अब दो दिए गए उदाहरणों के बीच अंतर, काफी स्पष्ट होना चाहिए।

पहले उदाहरण में, आप एक स्थिर चर मार्जिन कहा जाता है बना रहे हैं, MyWidget से संबंधित है, यानी आप तो

MyWidget::margin.horizontal 

कहाँ margin उदाहरण आपके द्वारा बनाए गए है की तरह horizontal सदस्य पहुँच सकते हैं।

जबकि यदि आपने संरचना के सदस्यों को स्थिर बना दिया है, तो आप ऐसा करने में सक्षम नहीं होंगे। Margin कहाँ struct है

MyWidget::Margin::horizontal 

: इसके बजाय, आप उन्हें इतनी तरह का उपयोग करना होगा। नोट हालांकि, दूसरे मामले में, स्थिर उदाहरण margin की कोई आवश्यकता नहीं है, क्योंकि इसमें इसके साथ जुड़े कोई उदाहरण फ़ील्ड नहीं हैं।

+0

इसलिए दूसरे मामले में मैं 'स्थैतिक कॉन्स स्ट्रक्चर मार्जिन {...} मार्जिन; 'को छोड़ सकता हूं और' कॉन्स्ट स्ट्रक्चर मार्जिन {...} मार्जिन; 'को संदर्भित करता हूं? –

+0

@PavloDyban फिर 'मार्जिन' एक आवृत्ति चर होगा, जिसका अर्थ है कि आपको काम करने में सक्षम होने के लिए 'MyWidget'' का एक उदाहरण चाहिए। – antonijn

3

हां, महत्वपूर्ण अंतर हैं। दोनों मामलों में आप MyWidget::margin घोषित करते हैं जो कि MyWidget::Margin प्रकार है और वे स्थैतिक हैं। पहले मामले में margin एक ऑब्जेक्ट है जिसमें दो फ़ील्ड हैं, horizontal और vertical। दूसरे मामले में, margin कोई ऑब्जेक्ट वाला कोई ऑब्जेक्ट नहीं है और आप उस ऑब्जेक्ट को छोड़ सकते हैं।

पहला मामला आप (यदि बाहर MyWidget से एक्सेस करते समय या MyWidget::margin.vertical) क्षेत्रों तक पहुँचने के लिए प्रपत्र margin.vertical उपयोग करने की आवश्यकता है, दूसरे मामले में, आप इसे इस Margin::vertical (या MyWidget::Margin::vertical) की तरह कर सकते हैं।

class MyWidget { 
    ... 
    static const struct Margin { 
    const int horizontal = 1; 
    const int vertical = 1; 
    } margin; 


    void foo() { 
    Margin anotherMargin = { 3, 4 }; 
    } 
}; 

यह मार्जिन का एक और उदाहरण बनाता है, विभिन्न सदस्यों होने:

+0

दूसरे मामले में 'मार्जिन' क्यों कोई ऑब्जेक्ट नहीं है? किसी भी तरह से संरचना से जुड़े स्थिर चर नहीं हैं? 'मार्जिन :: लंबवत' को कॉल करते समय 'संरचना मार्जिन' को पता होना चाहिए कि क्षैतिज और ऊर्ध्वाधर के मूल्यों को कहां प्राप्त करना है, है ना? –

+2

स्टेटिक फ़ील्ड ऑब्जेक्ट का हिस्सा नहीं हैं। आप मार्जिन के स्थिर क्षेत्रों के बारे में सोच सकते हैं जैसे कि वे नामस्थान में वैश्विक चर थे। – lego

+0

यह है! अब मैं समझ गया। चूंकि स्थैतिक चर सभी मामलों में समान हैं, इसलिए मैंने इन चरों को बदलने वाले पॉइंटर्स के बारे में सोचते रहे, लेकिन मैं वैश्विक युद्धों के बारे में भूल गया हूं। धन्यवाद! –

4

वहाँ वास्तव में एक अंतर है। staticstatic const struct Margin {...} margin; में margin पर लागू होता है, कक्षा/संरचना Margin पर नहीं। इसका मतलब है कि केवल My Margid ऑब्जेक्ट्स द्वारा साझा की गई एक मार्जिन ऑब्जेक्ट है, लेकिन आप अलग-अलग मान वाले अन्य मार्जिन ऑब्जेक्ट्स को बहुत अच्छी तरह से बना सकते हैं। उपर्युक्त कोड horizontal और vertical के साथ संकलित नहीं होगा, क्योंकि तब मार्जिन ऑब्जेक्ट में कोई सदस्य चर नहीं होगा (स्थिरता कोई वास्तविक सदस्य नहीं है) और इसलिए सभी मार्जिन ऑब्जेक्ट horizontal और vertical मान साझा करेंगे।