2010-05-21 16 views
13
// MyClass.h 

namespace MyNamespace { 

    static const double GasConstant = 1.987; 

    class MyClass 
    { 
    // constructors, methods, etc. 
    }; 
} 

मैं पहले GasConstant MyClass घोषणा के भीतर घोषित (और सी ++ के बाद से स्रोत फ़ाइल में एक अलग परिभाषा गैर अभिन्न प्रकार के const आरंभीकरण का समर्थन नहीं करता था) था पर है। हालांकि मुझे इसे अन्य फ़ाइलों से एक्सेस करने की आवश्यकता है और तर्कसंगत रूप से ऐसा लगता है कि इसे नामस्थान स्तर पर रहना चाहिए।क्या प्रभाव स्थिर स्थिरांक एक namespace सदस्य

मेरे प्रश्न है, static const इस मामले में क्या प्रभाव है? स्पष्ट रूप से const का अर्थ है कि मैं गैसकॉन्स्टेंट को नया मान निर्दिष्ट नहीं कर सकता, लेकिन नामस्थान पर स्थिर सदस्य का क्या अर्थ है। क्या यह फ़ाइल स्कोप पर स्थैतिक के समान है, जहां सदस्य इकाई के बाहर पहुंच योग्य नहीं है?

+0

क्या यह एक हेडर फ़ाइल (.h) में है या एक कार्यान्वयन फ़ाइल (.cpp) में ??? – AnT

+0

यह एक हेडर फ़ाइल (.h) में है। –

+2

सी ++ में कोई फ़ाइल स्कोप नहीं है। यदि आप बाहरी कार्यों और कक्षाओं के बाहर हैं तो सी ++ में केवल नामस्थान स्कोप हैं। इसके अलावा यदि आप कुछ पृष्ठों पर पढ़ते हैं जिन्हें वे "वैश्विक" कहते हैं, तो आमतौर पर उनका मतलब है कि वैश्विक नामस्थान और अन्य नामस्थान शामिल हैं। उदाहरण के लिए, 'cplusplus.com' शब्द "ग्लोबल" के गलत उपयोग के लिए जाना जाता है। तो अगर कुछ "वैश्विक दायरे" में "स्थैतिक" के प्रभावों को समझाता है, तो आमतौर पर इसका नाम नेमस्पेस स्कोप में होता है। –

उत्तर

7

नामस्थान स्कोप पर static का उपयोग * सी ++ में बहिष्कृत किया गया था। यह आमतौर पर केवल एक स्रोत फ़ाइल में देखा जाएगा, जहां इसका प्रभाव वैरिएबल स्थानीय को उस स्रोत फ़ाइल में बनाना है। यही है, एक और स्रोत फ़ाइल में बिल्कुल एक ही नाम का एक चर हो सकता है जिसमें कोई संघर्ष नहीं है।

सी ++ में, स्रोत फ़ाइल में स्थानीय चर बनाने के लिए अनुशंसित तरीका अज्ञात नेमस्पेस का उपयोग करना है।

मुझे लगता है कि यह कहना उचित है कि static आपके कोड में हेडर में बस गलत है।

* टिप्पणियों में टॉम द्वारा इंगित किया गया है (और इस answer में), सी ++ समिति ने फ़ाइल स्कोप पर static उपयोग को बहिष्कृत करने के फैसले को उलट दिया, इस आधार पर कि यह उपयोग हमेशा भाषा का हिस्सा होगा (उदाहरण के लिए सी संगतता)।

+1

ऐसा करने के लिए अनुशंसित तरीका .... "इस" से आपका क्या मतलब है? मुझे यकीन नहीं है कि यह मेरे लिए स्पष्ट है। –

+1

नेमस्पेस स्तर पर स्थैतिक को बहिष्कृत करने का निर्णय अब और नहीं है: http://stackoverflow.com/questions/4726570/deprecation-of-the-static-keyword-no-more, जो यह उत्तर गलत बनाता है, अब अज्ञात नामस्थानों का उपयोग करते हुए या स्थैतिक एक ही चीज़ को प्राप्त करने के लिए दो स्वीकार्य और सही तरीके हैं। – Tom

+0

अद्यतन के लिए धन्यवाद, @ टॉम - मैं जवाब अपडेट करूंगा। –

4

MSDN का कहना है:

एक चर को संशोधित करने, स्थिर कीवर्ड निर्दिष्ट करता है जब चर स्थिर अवधि है कि (यह आवंटित किया जाता है जब कार्यक्रम शुरू होता है और पुनः आवंटित की जाती है जब कार्यक्रम समाप्त होता है) और यह initializes 0 तक जब तक कोई अन्य मान निर्दिष्ट नहीं है। जब एक चर या समारोह फ़ाइल दायरे में संशोधित करने, स्थिर कीवर्ड निर्दिष्ट करता चर या समारोह आंतरिक संबंध है (जैसा कि इसके नाम फ़ाइल जिसमें यह घोषित किया जाता है बाहर से दिखाई नहीं देता है)।

याद रखें कि हेडर फाइलों सहित "हेडर फ़ाइल" के वास्तविक कोड के साथ "# अंतर्निहित" डायरेक्टिव को प्रतिस्थापित करने का मतलब है। इसलिए, स्थैतिक चर केवल ".cpp" (जिसे संकलित किया गया है) में दिखाई देगा जिसमें दो शीर्षलेख फ़ाइलें शामिल होंगी।

तो प्रत्येक "सीपीपी" -फाइल हेडर समेत इसका स्वयं का स्थिर चर होगा।

+0

अब मैंने एक Constants.h में गैस कॉन्स्टेंट घोषित/परिभाषित किया है जिसे MyClass.h में शामिल किया गया है। लगता है जैसे यह केवल उन फ़ाइलों में दिखाई देगा जिनमें Constants.h या MyClass.h शामिल है, और किसी भी अन्य फ़ाइल से नहीं। क्या होता है यदि दूसरी फ़ाइल में दोनों शामिल हैं? –

+3

प्रत्येक .cpp फ़ाइल को अपनी खुद की, स्वतंत्र प्रति प्राप्त होगी। हो सकता है कि आप जो भी चाहते हैं वह ठीक न हो ... या शायद यह हो। .cpp फ़ाइलों के लिए जिनमें दोनों शामिल हैं, यह कुछ भी नहीं बदला जाना चाहिए, लेकिन आपको निश्चित रूप से उचित शीर्षलेख सुरक्षा की आवश्यकता होगी। –

+0

ऐसा लगता है कि मैं जो करना चाहता हूं वह बस इसे स्थिर बना देता है। –

1

यदि यह एक हेडर फ़ाइल है, तो static इस मामले में कोई प्रभाव नहीं पड़ता है। const ऑब्जेक्ट्स में पहले से ही आंतरिक लिंक डिफ़ॉल्ट रूप से C++ में है, तो चाहे आप इसे static के साथ घोषित करें या static के बिना कोई फर्क नहीं पड़ता।

मुझे लगता है कि आप कक्षा से नामस्थान में घोषणा को स्थानांतरित कर चुके हैं। लेकिन static वर्ग घोषणा के संदर्भ में और नामस्थान के संदर्भ में पूरी तरह से अलग अर्थ है। कक्षा के अंदर, आपको static की आवश्यकता थी। नामस्थान में static अनिवार्य है।

+0

लेकिन क्या ऐसा नहीं है कि हेडर को शामिल करने वाली अलग-अलग फ़ाइलों में फ़ाइल स्कोप स्थिर के समान स्थिर संचालन के परिणामस्वरूप नामस्थान सदस्य के अलग-अलग उदाहरण होंगे? यह इसके आधार पर निश्चित रूप से कोई फर्क नहीं पड़ता है, यानी यह एक समस्या होगी यदि मैंने सोचा कि दोनों फाइलों के पास एक ही सदस्य तक पहुंच है और एक से अपडेट करना दूसरे में दिखाई देगा। बस इसे सीधे रखने की कोशिश कर रहा है। –

+1

वास्तव में, उसे कक्षा में 'स्थैतिक' की आवश्यकता नहीं है। इसके साथ और इसके बिना, दोनों 'डबल' के लिए अमान्य हैं :) –

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