2009-11-30 19 views
19

का उपयोग करते समय C2248 "निजी सदस्य तक नहीं पहुंच सकता" प्राप्त करना एक वर्ग ने ऑपरेटर new और delete ओवरलोड किए हैं। new सार्वजनिक है, delete निजी है।सार्वजनिक ऑपरेटर नया, निजी ऑपरेटर हटाएं: नए

जब इस वर्ग का एक उदाहरण के निर्माण, मैं निम्नलिखित त्रुटि मिलती है:

pFoo = new Foo(bar) 

example.cpp (1): त्रुटि C2248: 'फू: ऑपरेटर हटाएँ': निजी सदस्य कक्षा में घोषित उपयोग नहीं कर सकते 'फू'

लेकिन यहां delete पर कोई कॉल नहीं है, तो कंपाइलर के मुड़ दिमाग में क्या चल रहा है? :)

  1. त्रुटि का कारण क्या है?
  2. क्या सदस्य CreateInstance फ़ंक्शन का उपयोग किए बिना समस्या का समाधान करना संभव है?

उत्तर

26

जब आप new Foo() करते तो दो बातें होती हैं: सबसे पहले operator new स्मृति को आबंटित करने का आह्वान किया है, तो Foo के लिए एक निर्माता कहा जाता है। यदि वह कन्स्ट्रक्टर फेंकता है, क्योंकि आप पहले से आवंटित मेमोरी तक नहीं पहुंच सकते हैं, तो C++ रनटाइम इसे उचित operator delete पर पास करके इसका ख्याल रखेगा। यही कारण है कि आप हमेशा लिखने वाले प्रत्येक operator new के लिए मिलान operator delete को कार्यान्वित करना आवश्यक है और इसीलिए इसे सुलभ होने की आवश्यकता है।

एक तरह से आप दोनों को निजी बना सकते हैं और सार्वजनिक सदस्य फ़ंक्शन (जैसे create()) से operator new को आमंत्रित कर सकते हैं।

3

this देखें। निचले पैराग्राफ में से एक में यह कहता है कि नए को एक्सेस करने योग्य होने की आवश्यकता है। असल में यह कहता है, यदि आप उन्हें फिर से हटा भी सकते हैं, तो आप केवल ढेर पर ऑब्जेक्ट्स बना सकते हैं।

2

सी ++ मानकों के अनुसार, जब आपके पास गतिशील स्मृति आवंटन के साथ कक्षा होती है और कन्स्ट्रक्टर के अंदर एक अपवाद उठाया जाता है, तो मेमोरी लीक से बचने के लिए स्मृति को मुक्त किया जाना चाहिए।

यहां आपने अपना नया ऑपरेटर सार्वजनिक रूप से परिभाषित किया है, लेकिन हटाएं निजी है।

तो कंपाइलर आपको बता रहा है कि मुझे ऑपरेटर को हटाने के लिए पहुंच प्रदान करें ताकि मैं मेमोरी लीक को रोक सकूं यदि कन्स्ट्रक्टर में कोई अपवाद उठाया गया हो।

यदि आप अपने डिलीट ऑपरेटर को परिभाषित नहीं करते हैं, तो संकलक भी एक त्रुटि देगा और इसे परिभाषित करने के लिए मजबूर करेगा।

1
  • "1. त्रुटि का कारण क्या है?"

    एसबीआई का जवाब अच्छा है।

  • "2. क्या सदस्य CreateInstance फ़ंक्शन का उपयोग किए बिना समस्या को हल करना संभव है?"

    हां। निजी विनाशक बनाएँ।

+0

2 समस्या।यह है कि वर्ग विरासत में प्राप्त किया जा सकता है और यह विनाशक को सार्वजनिक रूप से सार्वजनिक रूप से फिर से परिभाषित किया जा सकता है। – Marius

+0

निजी विनाशक वाले किसी भी वर्ग को विरासत में नहीं मिला जा सकता है। –

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