2009-09-30 21 views
6

मैं निम्नलिखित श्रेणियां होती हैं:सी बच्चा कक्षा में आभासी विधि कॉल ++

class A { 
protected: 
    A *inner; 
public: 
    .... 
    virtual void doSomething() = 0; 
    .... 
} 

class B: public A { 
    ... 
    void doSomething() { 
     if(inner != NULL) 
      inner->doSomething(); 
    } 
    ... 
} 

जब मैं inner->doSomething() का उपयोग मैं एक विभाजन गलती मिलता है। बी कक्षा में inner->doSomething() पर कॉल करने के लिए मुझे क्या करना चाहिए?

अग्रिम धन्यवाद।

+3

यदि आपको आंतरिक उपयोग करते समय एक सेगफॉल्ट मिलता है, तो शायद यह इसलिए है क्योंकि यह किसी वैध ऑब्जेक्ट को इंगित नहीं करता है। आप बी में आंतरिक कैसे शुरू करते हैं? –

+0

प्रत्येक ए में ए * है? वास्तव में? क्यूं कर? –

+0

ठीक है, वे एक-दूसरे को देख रहे हैं। मैं बस जांचना चाहता था। –

उत्तर

9

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

एक के लिए एक उपयुक्त निर्माता निम्नलिखित

protected: 
A() : inner(NULL) { 
    ... 
} 
+1

कन्स्ट्रक्टर में जेरेडपार के सुझाव के लिए वैकल्पिक, आंतरिक = NULL निर्दिष्ट करें। Subclass के doSomething() में ब्रेकपॉइंट डालें और आंतरिक के मूल्य का निरीक्षण करें? – Calyth

+2

इसे प्रारंभ नहीं कर रहा था, क्योंकि मुझे उम्मीद है कि यह शून्य होगा और अगर कथन गलत होगा। मुझे नहीं पता था कि किसी ऑब्जेक्ट के लिए न्यूल नहीं होना चाहिए और अमान्य स्मृति को इंगित करना संभव होगा। मैंने बी के कंस्ट्रक्टर में आंतरिक = NULL किया और समस्या हल की। आपको बहुत बहुत धन्यवाद। – marcosbeirigo

+2

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

4

हालांकि यदि आप एक * आवंटित के रूप में बी इस सूचक आप एक ढेर अतिप्रवाह मिल जाएगा initialised ही होना होगा ... किसी भी कारण है कि आप भीतर की जरूरत है? क्या आप सिर्फ ए :: DoSomething() को कॉल नहीं कर सकते?

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