2010-02-26 12 views
5

निम्न कोड Visual C++ 2008 के लिए ठीक काम करता है। हालांकि, जब Visual C++ 6 के लिए आता है, तो मुझे निम्न त्रुटि मिलती है। मुझे पता है क्यों, और मैं त्रुटि को कैसे ठीक कर सकता हूं, लेकिन अभी भी विनाशक निजी में बना रहता है।क्यों विज़ुअल सी ++ 6 निजी विनाशक पर शिकायत करता है

class X 
{ 
public: 
    static X& instance() 
    { 
     static X database; 
     return database; 
    } 

private: 

    X() {}     // Private constructor 
    ~X() {}     // Private destructor 
    X(const X&);    // Prevent copy-construction 
    X& operator=(const X&); // Prevent assignment 
}; 

int main() 
{ 
    X::instance(); 
} 

C: \ परियोजनाओं \ ttt6 \ main.cpp (178): त्रुटि C2248: 'एक्स :: ~ एक्स': निजी सदस्य 'एक्स' कक्षा में सी घोषित उपयोग नहीं कर सकते: \ परियोजनाओं \ ttt6 \ main.cpp (175): देखने की घोषणा 'एक्स :: ~ एक्स'

+0

क्या रचनाकार/विनाशक हमेशा सार्वजनिक नहीं होना चाहिए? – vpram86

+3

@ एविएटर: रचनाकार हमेशा सार्वजनिक नहीं होना चाहिए। उदाहरण: एक अमूर्त वर्ग के लिए, आप केवल कन्स्ट्रक्टर को कॉल करने वाले व्युत्पन्न कक्षाएं चाहते हैं (इस प्रकार आप अमूर्त वर्ग के तत्कालता को रोक सकते हैं), ताकि आप इसे 'संरक्षित' बना सकें। सिंगलेट्स के लिए आप केवल उदाहरण के लिए क्लास की स्थिर 'CreateInstance()' विधि चाहते हैं, ताकि आप कन्स्ट्रक्टर 'निजी' बना सकें। –

+0

@ स्कॉट: बहुत बहुत धन्यवाद। मैं इसे अब समझता हूँ। – vpram86

उत्तर

7

संशोधित नमूना वीसी 6 के लिए एक पुष्टिकरण कंपाइलर बग दिखाता है - आम कामकाज केवल विनाशक को सार्वजनिक बनाना था।

+0

क्या आपके पास यह बग क्या है इसके लिए कोई संदर्भ है? –

+0

मुझे बेहतर संदर्भ खोजने में कठिनाई होती है, फिर मेरी स्मृति या पुराने थ्रेड जैसे http://www.codeguru.com/forum/archive/index.php/t-236067.html –

+1

इस बग पर भी कुछ चर्चा की गई थी प्रश्न: http://stackoverflow.com/questions/2130864/cannot-access-private-member-in-singleton-class-destructor –

4

fun() में आप एक अलग वस्तु, aa पैदा कर रहे हैं और फिर असाइनमेंट ऑपरेटर के माध्यम से इसे करने के लिए a::instance() द्वारा लौटाए गए ऑब्जेक्ट संदर्भ के मान को कॉपी। यह काम नहीं करेगा क्योंकि दोनों कन्स्ट्रक्टर और विनाशक निजी हैं।

a &aa = a::instance(); 
+0

वास्तव में यह प्रतिलिपि ctor के माध्यम से इसे कॉपी करने का प्रयास करता है। –

+0

क्षमा करें। मेरे कोड उदाहरण में कुछ गलती। मैंने संशोधित किया था। कोड अभी भी वीसी 6 में त्रुटि देता है लेकिन वीसी -2008 में पास करता है। –

+1

@ यान: यह गुजरता नहीं है, मैं वादा करता हूं; आपका परीक्षण गलत है। उदाहरण कोड के बजाय हमें अपना असली कोड दें। – GManNickG

2

जब मज़ा के अंत() तक पहुँच जाता है, अपने चर क्षेत्र से बाहर जाना होगा और नाशक कहा जाएगा: aa एक संदर्भ होना चाहिए।

ऐसा लगता है कि आप एक सिंगलटन को लागू करने की कोशिश कर रहे हैं - शायद आप इसका मतलब है?

& aa = a :: instance();

यदि एए एक उदाहरण के बजाय संदर्भ है तो विनाशक को मज़ा() के अंत में नहीं बुलाया जाएगा।

+0

क्षमा करें। मेरे कोड उदाहरण में कुछ गलती। मैंने संशोधित किया था। कोड अभी भी वीसी 6 में त्रुटि देता है लेकिन वीसी -2008 में पास करता है। –

0

यह सिर्फ वीसी 6 बग है। वीसी 6 बहुत छोटी है। आप वर्कअराउंड के रूप में std :: auto_ptr <> का उपयोग कर सकते हैं।

#include <memory> 

class X 
{ 
    friend std::auto_ptr<X>; 
public: 
    static X& instance() 
    { 
     static std::auto_ptr<X> database(new X); 
     return *database; 
    } 
..... 
}; 

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

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