2011-09-05 13 views
16

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

class Base { 
protected: 
    int var ; 
}; 

class Derived : public Base { 
    static bool Process(Base *pBase) { 
    pBase->var = 2; 
    return true; 
    } 
}; 

मेरे संकलक शिकायत है कि मैं pBase के संरक्षित सदस्यों भले ही व्युत्पन्न बेस के लिए उपयोग की रक्षा की है का उपयोग नहीं कर सकते हैं। क्या इस के आसपास कोई रास्ता है या क्या मैं कुछ गलत समझ रहा हूं? मैं आधार चर सार्वजनिक कर सकता हूं लेकिन यह मेरे वास्तविक उदाहरण के रूप में खराब होगा क्योंकि यह आवंटित स्मृति का एक टुकड़ा है और इसे बहुसंख्यक के लिए संरक्षित करने के लिए सेफफोर्स हैं।

सहायता?

+1

[माता पिता की रक्षा की चर को एक्सेस करना] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/4829518/accessing-parents-protected-variables)। यह विशेष रूप से यह नहीं है कि फ़ंक्शन 'स्थैतिक' है, लेकिन ऐसा इसलिए है क्योंकि जिस पैरामीटर के आधार पर आधार सदस्य का उपयोग किया जा रहा है वह 'व्युत्पन्न' प्रकार का नहीं है। –

+0

फ़ंक्शन पॉइंटर की कॉलिंग आवश्यकताओं के अनुरूप स्थिर फ़ंक्शन का तर्क बेस क्लास का होना चाहिए। हो सकता है कि मैं इसे गतिशील कास्ट –

+1

का उपयोग करके प्राप्त कर सकूं यदि आप यह नियंत्रित कर सकते हैं कि फ़ंक्शन को केवल 'बेस' ऑब्जेक्ट्स के पॉइंटर्स के साथ बुलाया जाता है जो 'व्युत्पन्न' ऑब्जेक्ट्स के बेस क्लास उप-ऑब्जेक्ट्स हैं जिन्हें आप परिवर्तित करने के लिए 'static_cast' का उपयोग कर सकते हैं फ़ंक्शन बॉडी में 'बेस *' 'व्युत्पन्न *' '। अन्यथा आपको 'बेस' का 'मित्र' होना होगा या आप सार्वजनिक होने के लिए 'var' बदल सकते हैं। यदि आप इनमें से कोई भी नहीं कर सकते हैं तो आप अटक गए हैं। –

उत्तर

10

सामान्य रूप से (चाहे फ़ंक्शन स्थिर है या नहीं), व्युत्पन्न वर्ग का सदस्य फ़ंक्शन केवल अपने प्रकार की वस्तुओं के संरक्षित आधार वर्ग सदस्यों तक पहुंच सकता है। यह स्थिर आधार के सदस्यों को संरक्षित नहीं कर सकता है यदि स्थिर प्रकार व्युत्पन्न वर्ग (या उससे प्राप्त कक्षा) से नहीं है। तो:

class Base { 
protected: 
    int var; 
} ; 

class Derived : public Base { 
    static void f1(Derived* pDerived) 
    { 
     pDerived->var = 2; // legal, access through Derived... 
    } 
    static bool Process(Base *pBase) 
    { 
     pBase->var = 2 ; // illegal, access not through Derived... 
    } 
} ; 
+0

तो मुझे लगता है कि मेरे स्थिर फ़ंक्शन का उपयोग फ़ंक्शन पॉइंटर के लिए किया जाता है और तर्क को बेस क्लास होने की आवश्यकता होती है, मुझे गतिशील रूप से व्युत्पन्न कक्षा में डालने में सक्षम होना चाहिए। –

+1

यदि बेस क्लास में कम से कम एक वर्चुअल फ़ंक्शन है, तो हाँ। (या आप 'व्युत्पन्न *' लेने के लिए फ़ंक्शन को बदल सकते हैं, और 'dynamic_cast' को क्लाइंट तक छोड़ सकते हैं।) –

0

पहुँच विनिर्देशक Derived वर्ग हैंडल (संदर्भ/सूचक/वस्तु) और नहीं Derived वर्ग खुद के तरीकों पर लागू होता है। भले ही विधि static नहीं थी, तो आप एक ही त्रुटि के साथ समाप्त हो गए होंगे। क्योंकि आप व्युत्पन्न हैंडल के साथ var तक नहीं पहुंच रहे हैं। Demo

class Base { 
protected: 
    int var ; 
public: 
    void setVar(const int v) { var = v; } // <--- add this method 
}; 

नोट::

सही तरीका एक setter विधि प्रदान करना है एक और तरीका नहीं है, लेकिन मुझे यकीन है कि अगर यह सुंदर है नहीं कर रहा हूँ।

(static_cast<Derived*>(pBase))->var = 2; 
+0

दुर्भाग्यवश मेरी असली कक्षा में बेस क्लास में डेटा वास्तव में स्मृति के कुछ ब्लॉक और सेमफोरों का भार है बहु थ्रेडेड एक्सेस के लिए। सेमफोरों और स्मृति के ढेर के लिए गेटर्स और सेटर्स का उपयोग करना बहुत बोझिल लगता है क्योंकि आधार में 10-15 चर हो सकते हैं। –

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

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