2012-06-03 29 views
5

मान लीजिए हमस्टेटिक सदस्य वस्तु

class Egg 
{ 
static Egg e; 
int i; 
Egg(int ii):i(ii) {} 
Egg(const Egg &); //Prevents copy-constructor to be called 
public: 
static Egg* instance() {return &e} 
}; 

Egg Egg::e(47); 

इस कोड की गारंटी देता है कि हम किसी भी वस्तु नहीं बना सकते के रूप में एक वर्ग है, लेकिन केवल स्थिर वस्तु इस्तेमाल कर सकते हैं। लेकिन हम कक्षा में एक ही कक्षा के स्थिर वस्तु की घोषणा कैसे कर सकते हैं।

और ई एक स्थिर वस्तु है, इसलिए एक चीज और स्थिर वस्तुएं केवल स्थिर सदस्य कार्य कह सकती हैं, तो स्टेटिक ऑब्जेक्ट के लिए कन्स्ट्रक्टर को यहां कैसे बुलाया जा सकता है, इसके रचनाकार भी निजी हैं।

उत्तर

6

लेकिन हम कक्षा में एक ही कक्षा के स्थिर वस्तु को कैसे घोषित कर सकते हैं।

static सदस्य चर एक वर्ग के प्रत्येक ऑब्जेक्ट के अंदर संग्रहीत नहीं है। इसलिए यदि आप वर्ग को परिभाषित करने के बाद कक्षा के अंदर static सदस्य चर या घोषणा के बाद नामस्थान स्तर वस्तु के रूप में घोषित करते हैं, तो केवल एक्सेस (Class::var और var) के संबंध में अलग है और protected और private सदस्यों तक पहुंच है।

और यह भी एक बात e के बाद से अधिक एक स्थिर वस्तु है, और स्थिर वस्तुओं केवल स्थिर सदस्य कार्यों

मुझे लगता है कि कॉल कर सकते हैं आप static कार्य करता है और static वस्तुओं मिश्रण कर रहे हैं। static फ़ंक्शन के अंदर आप केवल static फ़ंक्शंस को कॉल कर सकते हैं (जब तक कि आप उन्हें किसी ऑब्जेक्ट पर कॉल नहीं कर रहे हों)।

तो कैसे कर सकता निर्माता भी स्थिर वस्तु हर दूसरे वस्तु एक निर्माता static वस्तुओं के लिए बुलाया जाना है के लिए e

तरह के लिए यहां बुलाया गया,।

भी अपने कंस्ट्रक्टर्स निजी

अभिगम नियंत्रण सी में कक्षा स्तर ++ पर जाँच की है। इसलिए static ऑब्जेक्ट कक्षा के अंदर है, इसलिए यह private सदस्यों तक पहुंच सकता है।

कुछ अन्य भाषाओं में विपरीत, निम्न, C++ कानूनी है के बाद से एक निजी सदस्य के लिए उपयोग वर्ग के भीतर से है - भले किसी अन्य वस्तु (इस मामले में other) पर अगर:

class Test { 
private: 
     int i; 
public: 
     Test(const Test &other) 
     : i(other.i) 
     {} 
}; 
+0

स्टेटिक वस्तु वर्ग के अंदर है, लेकिन कैसे यह निजी निर्माता का उपयोग कर सकते हैं। ऑब्जेक्ट्स सामान्य रूप से नहीं बनाए जा सकते हैं यदि उनका कन्स्ट्रक्टर निजी है। – Luv

+1

यह कन्स्ट्रक्टर तक पहुंच सकता है क्योंकि इसे कक्षा के अंदर परिभाषित किया गया है। कक्षा के भीतर सबकुछ निजी सदस्यों तक पहुंच सकता है। –

2

लेकिन हम कक्षा में एक ही कक्षा के स्थिर वस्तु को कैसे घोषित कर सकते हैं।

आम तौर पर आप एक आगे संदर्भ आवश्यकता होगी, लेकिन जब से अंडे ई स्थिर है, यह वास्तव में वर्ग परिभाषा के बाहर परिभाषित किया है। यदि ई स्थैतिक नहीं था, तो आपको एक त्रुटि मिलेगी (कुछ "फ़ील्ड जैसे Egg ई में अपूर्ण प्रकार" है)।

और यह भी एक बात है के बाद से ई अधिक एक स्थिर वस्तु है, और स्थिर वस्तुओं केवल स्थिर सदस्य कार्यों कॉल कर सकते हैं, तो कैसे निर्माता यहाँ के लिए स्थिर वस्तु ई बुलाया गया हो सकता है।

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

इसके निर्माता भी निजी हैं।

किसी भी निजी सदस्य को कक्षा के भीतर से उपयोग किया जा सकता है। चूंकि स्थैतिक अंडे ई अंडे के सदस्य के रूप में घोषित किया गया है, यह निजी कन्स्ट्रक्टर का उपयोग कर सकता है। ई की परिभाषा कक्षा से बाहर है क्योंकि यह स्थैतिक है, लेकिन यह अभी भी एक वर्ग सदस्य है।

और अंत में अपने कोड संकलन नहीं है क्योंकि आप एक अर्धविराम यहाँ बाहर छोड़ दिया:

static Egg* instance() {return &e;}