2011-04-04 16 views
7

मैं ऐसे कोड के साथ काम कर रहा हूं जिसमें वैश्विक स्थैतिक चर (जो एक वस्तु है) है और मुझे इसे किसी अन्य वर्ग से एक्सेस करने की आवश्यकता है। मैंने हमेशा वैश्विक चर/कार्यों को सामान्य रूप से टाल दिया है, इसलिए इस स्थिति में मुझे यकीन नहीं है कि इसके बारे में कैसे ठीक से जाना है।किसी अन्य वर्ग से वैश्विक स्थिर चर का उपयोग

चीजों की मेरी समझ को साफ़ करने के लिए, वैश्विक स्थैतिक चर में आंतरिक संबंध है, जिसका अर्थ है कि इस विशेष शीर्षलेख को शामिल करने वाली किसी भी स्रोत फ़ाइल को चर की अपनी प्रति प्राप्त होगी?

संपादित करें: मैंने अभी तक जो प्रयास किया है वह एक ऐसा फ़ंक्शन बना रहा है जो चर के पते को लौटाता है। दुर्भाग्यवश, ऐसा लगता है कि यह काम नहीं कर रहा है।

// names were changed but the code is as follows. 
// There is of course other code in the header 
namespace SomeNameSpace 
{ 
    static anArray<someObject> variable; 
} 

नोट: मैं हैडर जहां वैश्विक स्थिर चर घोषित किया जाता है में कोड नहीं बदल सकते। मैं फ़ंक्शंस जोड़ सकता हूं लेकिन अगर मैं कर सकता हूं तो मुझे इससे बचने की कोशिश करनी चाहिए।

+1

क्या आप दिखा सकते हैं कि वैश्विक कैसे घोषित किया जाता है? –

+0

क्या यह कक्षा का सदस्य है? लोक सदस्य? –

+0

यह किसी भी वर्ग का सदस्य नहीं है। @ टिमो: कृपया नवीनतम संपादन – Samaursa

उत्तर

2

आप एक .cpp फ़ाइल में कंटेनर के मास्टर संस्करण पर निर्णय ले सकते हैं, और फ़ंक्शन में संदर्भ या पॉइंटर वापस कर सकते हैं। फिर दूसरी प्रतियों से परेशान मत हो।

Wrapper.h

anArray<someObject>& Objects(); 

Wrapper.cpp

#include "someHeader.h" 

anArray<someObject>& Objects() 
{ return SomeNameSpace::variable; } 

या, वापसी मान एक स्थिरांक संदर्भ बनाने यदि आप मूल्यों को बदलने के लिए इरादा नहीं है।

0

हेडर फाइल चर static int a; रूप में घोषित किया है तो हाँ, हर अनुवाद इकाई है कि कि शीर्ष लेख शामिल हैं यह चर a की खुद प्रतिलिपि है और मुसीबत सुनिश्चित करता मिल जाएगा।

यदि इसे extern int a के रूप में घोषित किया गया है, तो चर को सभी अनुवाद इकाइयों में साझा किया जाता है जहां इसे शामिल किया गया है, और किसी अन्य फ़ाइल में परिभाषित किया गया है।

0

इसे इस तरह की घोषणा की जाती है:

MyClass myObj; 

तो प्रत्येक सीपीपी फ़ाइल है कि किसी तरह से संभवतः अन्य हेडर के माध्यम से, शीर्ष लेख भी शामिल है, एक प्रति प्राप्त होगा, और के बाद से वे सभी एक ही नाम होगा लिंकर शिकायत करेगा।

हालांकि, यह इस तरह की घोषणा की है, तो:

extern MyClass myObj; 

तो यह सिर्फ घोषित है और यह एक से अधिक फ़ाइलों में शीर्ष लेख शामिल तरीके से कार्य करेंगे, लेकिन यह एक .cpp फ़ाइल में परिभाषित किया जाना चाहिए।

+0

इसे इस प्रकार घोषित किया गया है: 'static anArray परिवर्तनीय;' – Samaursa

1

जब आप आप में घोषित फ़ाइल

static int g_foo; 

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

जब आप

class Foo 
{ 
    public: 
     static int bar; 
}; 

घोषित तो आप एक स्थिर सदस्य है कि int Foo::bar; के रूप में एक .cpp फ़ाइल में परिभाषित किया जाना चाहिए पहुँच इस मामले में सार्वजनिक रूप में परिभाषित है मिलता है।

+0

जो मैं समझता हूं, लेकिन मैं एकाधिक '.cpp' फ़ाइलों से पूर्व (यानी,' स्थिर int g_foo') तक पहुंचने के बारे में कैसे जा सकता हूं? – Samaursa

0

इस ऑब्जेक्ट को तुरंत चालू कर रहा है कौन? क्या होता है यदि ऑब्जेक्ट को तत्काल किए बिना एक्सेस किया जाता है?

क्या आपको इसे ऐसे फ़ंक्शन में नहीं डालना चाहिए जो इसे तुरंत चालू करेगा?

...

anArray<someObject> aStaticVariable() 
{ 
    static anArray<someObject> myStaticVariable; 
    return myStaticVariable; 
} 

संपादित करें: aClass.h

static Object myObj; 

aClass.cpp

aClass(const &Params params): 
myObj(params.x) 
{ 
    .... 
} 

bClass.cpp

extern Object aClass::myObj; //not necessarily initialised 
bClass{ 
    ... 
    myObj.getSomething(); //problem maybes 
    ... 
} 
+0

ठीक है, क्योंकि यह एक स्वचालित चर है, मुझे लगता है कि प्रोग्राम शुरू होने पर इसे तुरंत चालू किया जा रहा है। – Samaursa

+0

@ सैमौर्स हाँ, जब आप इसका उपयोग करने का प्रयास करेंगे तो इसे तुरंत चालू किया जाएगा, लेकिन यह संकलन इकाई के बाहर नहीं है। उदाहरण के लिए, यदि आप 'बाहरी स्थैतिक anArray myStaticVariable' का उपयोग करते हैं, और आप उस श्रेणी को तुरंत चालू नहीं करते हैं, तो यदि आप इसे एक अलग वर्ग 'myStaticVariable.push (ए) में उपयोग करते हैं;' और इसे प्रारंभ नहीं किया गया है तो आप परेशानी में हैं। इसे प्रारंभ किया जा सकता है लेकिन विभिन्न अनुवाद इकाइयों में परिभाषित गैर-स्थानीय स्थैतिक वस्तुओं के प्रारंभिक होने का सापेक्ष क्रम अपरिभाषित है। – Dennis

+0

कोड में 'बाहरी' नहीं है। साथ ही, प्रारंभिकरण का सापेक्ष आदेश केवल तभी मायने रखता है जब मैं कार्यक्रम शुरू करने के समय में सरणी का उपयोग करने की कोशिश कर रहा हूं, नहीं? यदि हां, तो यह कोई मुद्दा नहीं है क्योंकि प्रोग्राम चलाने के दौरान मैं इसे रनटाइम पर एक्सेस कर रहा हूं। यदि नहीं (यानी, इसे रनटाइम पर भी शुरू नहीं किया जा सकता है), कृपया इस मामले में स्थिर चर कैसे काम करते हैं, इसकी मेरी समझ को सही करें। – Samaursa

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