2010-10-26 7 views
6

वर्तमान में मैं बहुप्रचारित वातावरण में रैपर एक्सेसर क्लास बनाना चाहता हूं। कक्षा का उद्देश्य सरल है - इसके निर्माण पर एक ताला पकड़ो और इसके विनाश पर एक ताला छोड़ दें। इसके अलावा, यह एक सामान्य सूचक के समान है। इसके अलावा, मैं इसे सुनिश्चित करने के लिए ढेर क्षेत्र पर बनाए जाने से रोकना चाहता हूं कि अंततः लॉक जारी किया जाएगा।सी ++ में स्टैक-केवल परिवर्तनीय संभव है?

उलटा काफी आसान है (फैक्ट्री विधि के साथ निजी कन्स्ट्रक्टर), लेकिन मुझे नहीं पता कि एक स्टैक-केवल चर संभव है। क्या कोई रास्ता है?

+2

मुझे लगता है कि इस तरह की चीजें अनावश्यक हैं। प्रत्येक सभ्य प्रोग्रामर को अपने जोखिम पर नए/हटाए जाने के बारे में पता होना चाहिए। यदि प्रोग्रामर इस वस्तु को ढेर पर चाहता है और कक्षा के अस्तित्व के बिंदु को फेंक देता है, तो उन्हें दो। –

+0

जो आप पूछ रहे हैं वह असंभव और अनावश्यक है। यदि एक अक्षम प्रोग्रामर आपके कोड का उपयोग करता है, तो वे अपना स्वयं का एप्लिकेशन * वैसे भी * तोड़ने में कामयाब होंगे। और यदि वे सक्षम हैं, तो वे आपके लॉक ऑब्जेक्ट को जिस तरह से इसका मतलब है: आवंटित संदर्भ में आवंटित करेंगे। – jalf

+5

"मर्फी के खिलाफ सुरक्षा, मचियावेली नहीं" - हर्ब सटर – MSalters

उत्तर

12

ठीक है, आपके वर्ग के लिए operator new अधिभार के बारे में क्या है और इसे निजी रूप से डिलीवरी करते हैं?

+0

धन्यवाद। मैं अभी तक ऑपरेटर के बारे में पूरी तरह से भूल गया हूँ! हालांकि यह इसे ढेर क्षेत्र पर बनाने से पूरी तरह से रोक नहीं सकता है (क्योंकि यह नए ऑपरेटर द्वारा बनाई गई वस्तु में सदस्य चर हो सकता है), लेकिन यह कई गलतियों को रोकने में मददगार होगा। – summerlight

+0

@ समरलाइट: मेरा मानना ​​है कि इसे ढेर संकलन-समय या पोर्टेबल पर बनाए जाने से रोकना असंभव है। –

+4

yup, यहां तक ​​कि एक निजी 'ऑपरेटर नया' के साथ, यह एक रैपर ऑब्जेक्ट लिखने के लिए कोड की 5 लाइनों की तरह कुछ होगा जिसमें * आपकी ऑब्जेक्ट शामिल है, और जिसे ढेर पर आवंटित किया जा सकता है। हमेशा के रूप में सी ++ लाइब्रेरी कोड लिखते समय, आप यह निर्धारित नहीं कर सकते कि उपयोगकर्ता * को इसका उपयोग कैसे करना चाहिए। आपको यह मानना ​​है कि लाइब्रेरी उपयोगकर्ता सचेत है और वास्तव में अपने प्रोग्राम को तोड़ने की कोशिश नहीं करेगा। और यदि आप उस धारणा को बनाते हैं, तो आपको अपनी वस्तु को ढेर करने के लिए असंभव बनाने के लिए * आवश्यकता नहीं है *। – jalf

0

मुझे समस्या नहीं समझती? फ़ंक्शन के दायरे में परिभाषित कोई भी चर केवल स्टैक-केवल है।

class Lock { 
public: 
    Lock() { 
     performLock(); 
    } 

    ~Lock() { 
     performUnlock(); 
    } 
} 

void foo() { 
    // ... Code 
    Lock onStackOnly; 
    // ... Code that is locked 
} 


void foo() { 
    // ... Code 
    { 
     Lock onStackOnly; 
     // ... Code that is locked 
    } 

    // This code is unlocked. 
} 
+0

"मैं इसे ढेर क्षेत्र पर बनाए जाने से रोकना चाहता हूं"। वह 'नया लॉक();' संभव नहीं होना चाहिए –

+3

उसका प्रश्न यह है कि चर के दायरे में परिभाषित करने के लिए चर को कैसे बल दिया जाए और ढेर पर किसी भी तत्कालता को रोकने के लिए। – BatchyX