2010-12-29 8 views
8

ऐसा कुछ है जो मुझे परेशान कर रहा है।विधियों में स्टेटिक स्थानीय चर एक बुरी प्रैक्टिस?

गैर-थ्रेडेड प्रोग्राम में, स्थानीय स्थिर चर (अंदरूनी विधियों) या स्थिर वर्ग के सदस्यों के लिए बेहतर है?

इस उदाहरण में:

class C{ 
public: 
    C(){}; 
    void foo(); 
}; 

void C::foo(){ 
    static int bar = 0; 
    bar++; 
    printf("%d\n",bar); 
} 

यह एक बुरा अभ्यास माना जाता bar केवल C::foo() में इस्तेमाल किया जाएगा, तो है?

उत्तर

7

न तो बेहतर है। वे बहुत अलग उपयोग मामलों की सेवा करते हैं

+4

आपके उत्तर की शुरुआत वादा करने लगती है, लेकिन क्या आप विस्तृत कर सकते हैं? –

+12

@IIyan, उनके कोड में अर्थशास्त्र "प्रिंट करें कितनी बार 'foo' कहा जाता था!"। अपने प्रश्न में जो भी देख सकता है, उसके पास वर्ग की स्थिति से कोई लेना-देना नहीं है, और इसलिए वैरिएबल को स्थिर वर्ग सदस्य के रूप में रखना गलत होगा। यदि हालांकि 'foo' एक कॉपी कन्स्ट्रक्टर होगा और' बार 'को' नंबरऑफकोपी 'कहा जाएगा, तो यह एक स्थिर वर्ग के सदस्य के लिए एक अच्छा उम्मीदवार होगा।तो यह इस बात पर निर्भर करता है कि इसका उपयोग कैसे किया जाता है। –

0

ऑब्जेक्ट उन्मुख बोलने वाला, बार राज्य वर्ग सी के राज्य का हिस्सा है। यही कारण है कि मैं आमतौर पर स्थैतिक स्थानीय चर के बजाय फ़ील्ड का उपयोग करना पसंद करता हूं।

+0

किस वस्तु का राज्य? वैश्विक चर (इस उदाहरण में सांख्यिकी) किसी भी वस्तु की स्थिति का हिस्सा नहीं हैं, वे वैश्विक स्थिति का हिस्सा हैं। –

+0

धन्यवाद, @ जीन। मैंने जवाब संपादित किया। –

+0

नहीं, यह नहीं है। केवल गैर स्थैतिक सदस्य किसी ऑब्जेक्ट के "राज्य" के रूप में कार्य कर सकते हैं। –

2

यदि यह एक सार्वजनिक वर्ग है, तो स्थिर वर्ग के सदस्य को हेडर फ़ाइल को संपादित करने की आवश्यकता होती है। यह हमेशा वांछनीय नहीं है।

एक और विकल्प एक अज्ञात नेमस्पेस में फ़ाइल-स्कोप्ड चर है। यह पर्याप्त है यदि आपको केवल एक विधि में पहुंच की आवश्यकता है, और यदि आपको इसे एकाधिक में चाहिए।

0

दोनों स्थानीय और गैर-स्थानीय वैश्विक चर वैश्विक होने के गुण से "खराब" हैं। लेकिन उन दो मामलों के लिए प्रारंभिकरण और पहुंच अलग-अलग हैं, इसलिए जो जवाब उपयोग करना है, वह उन आवश्यकताओं के संबंध में आपकी आवश्यकताओं पर निर्भर करता है।

एक साइड नोट के रूप में, स्थैतिक भंडारण अवधि के साथ स्थानीय चर के गतिशील प्रारंभिक आपके कंपाइलर के आधार पर थ्रेड-सुरक्षित नहीं हो सकता है। अच्छी खबर, सी ++ 0x में यह थ्रेड-सुरक्षित होने की गारंटी है।

+0

वैश्विक चर के साथ गलत नहीं है। समस्या विश्व स्तर पर सुलभ परिवर्तनीय स्थिति के साथ है। यहां भी सच नहीं है। –

4

मैं आमतौर पर जितना संभव हो चर के दायरे को सीमित करने का प्रयास करता हूं, जब तक कि यह अजीब या थकाऊ न हो।

आप समारोह foo में कोड की 100 लाइनों, कोई भी परिवर्तन करने के लिए कर barclass C में कोड के 1000 लाइनों है, तो उनमें से (उदाहरण के लिए, नाम या प्रकार बदलने) बनाने के लिए कोड के 100 से अधिक लाइनों जा रहा की आवश्यकता है सुनिश्चित करें कि परिवर्तन ठीक है। यदि आपके पास bar एक स्थैतिक वर्ग सदस्य था, तो आपको यह सुनिश्चित करने के लिए कि bar का उपयोग नहीं किया गया है, आपको 1000 से अधिक लाइन कोड कोड करना पड़ सकता है। यह समय बर्बाद होगा।

आपको लगता है यदि आप किसी अन्य समारोह foo2 में bar करनी पड़ सकती है (उदाहरण के लिए, जब एक साथ foo और foo2 के लिए कॉल गिनती बढ़ रहा है), तो आप bar एक स्थिर वर्ग के सदस्य बनाने के लिए चाहते हो सकता है।

+0

+1 "स्थैतिक" चरणीय दायरा को कम करना महत्वपूर्ण है। ग्लोबल बनाम। सीपीपी मॉड्यूल बनाम कक्षा बनाम विधि/फ़ंक्शन बनाम नेस्टेड {} ब्लॉक। मैं वर्ग घोषणा में शामिल होने पर .cpp मॉड्यूल स्तर स्थिर डेटा का उपयोग करना पसंद करता हूं, क्योंकि यदि आप इसे कक्षा शीर्षलेख में चिपकाते हैं, तो ग्राहक अब कार्यान्वयन विवरण पर निर्भर हैं। – franji1

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