2009-07-23 13 views
8

मैं एक साधारण बी + पेड़ कार्यान्वयन (बहुत शुरुआती चरणों) लिखने का प्रयास कर रहा हूं। मुझे कुछ कार्यों के साथ वर्चुअल क्लास मिला है। कहने की जरूरत नहीं है, मैं इन रणनीतियों के लिए बहुत नया हूं और सभी प्रकार की समस्याओं में भाग रहा हूं।सी ++ शुद्ध आभासी वर्ग प्रश्न

मैं बीटीआर कक्षा के भीतर रूट नोड बनाने का प्रयास कर रहा हूं। रूट नोड बीबीआरएंच होगा, जिसे बीएनओडी से प्राप्त किया जाना चाहिए? मैं त्रुटियों

btree.cpp: In constructor âBTree::BTree()â: 
btree.cpp:25: error: cannot declare variable ârootâ to be of abstract type âBBranchâ 
btree.cpp:12: note: because the following virtual functions are pure within âBBranchâ: 
btree.cpp:9: note:  virtual void BNode::del(int) 
btree.cpp: In member function âvoid BTree::ins(int)â: 
btree.cpp:44: error: ârootâ was not declared in this scope 

हो रही है कोड इस

using namespace std; 

class BNode { 
    public: 
    int key [10]; 
    int pointer [11]; 
    virtual void ins(int num) =0; 
    virtual void del(int num) =0; 
}; 

class BBranch: public BNode { 
    public: 
    void ins(int num); 
}; 

class BLeaf: public BNode { 
    public: 
    void ins(int num); 
}; 

class BTree { 
    public: 
    BTree() { 
     BBranch root; 
    }; 
    void ins(int num); 
}; 

// Insert into branch node 
void BBranch::ins(int num){ 
    // stuff for inserting specifically into branches 

}; 

// Insert for node 
void BTree::ins(int num){ 
    root.ins(num); 
}; 

int main(void){ 
    return 0; 
} 

किसी भी जानकारी मुझे दे सकते हैं के लिए धन्यवाद है।

+3

मैं आपको सभी प्रतिक्रियाओं के लिए धन्यवाद देना चाहता हूं ... मैं स्वीकार करता हूं, मैं एक महान सी ++ प्रोग्रामर नहीं हूं और इस परियोजना में इन नए विचारों (आभासी कक्षाओं/कार्यों) को लागू करने की कोशिश कर रहा हूं। मुझे त्रुटि कोड के सिर या पूंछ बनाने में भी कठिनाई होती है, लेकिन आपने सभी ने मेरी त्रुटि देखने में मेरी सहायता करने का एक अच्छा काम किया है। धन्यवाद! – kreeves

उत्तर

10

संकलक क्या गलत है के बारे में स्पष्ट रूप से स्पष्ट प्रतीत होता है। आप BBranch घोषित नहीं कर सकते क्योंकि उस वर्ग में अभी भी एक शुद्ध वर्चुअल फ़ंक्शन है। आपने ins परिभाषित किया है, लेकिन del अभी भी अपरिभाषित है। परिभाषित करें कि BBranch (और BLeaf) में और आपको ठीक होना चाहिए।

आप अमूर्त वर्गों के उदाहरण घोषित नहीं कर सकते हैं, जो कक्षाएं हैं जिनमें शुद्ध आभासी कार्य हैं।

इसके अलावा, आपने में rootघोषित कर दिया है। आप इसके लिए सदस्य चर होने का मतलब है, जिसका अर्थ यह है कि कंस्ट्रक्टर के पास के अंदर घोषित करने की आवश्यकता है।

class BTree { 
    public: 
    BTree() { 
    }; 
    BBranch root; 
    void ins(int num); 
}; 
1

बीटीआर कन्स्ट्रक्टर में, आप बीबीआरएएन का एक उदाहरण बनाने की कोशिश कर रहे हैं। लेकिन बीबीआरएंच में डेल() का कार्यान्वयन नहीं है, इसलिए यह एक अमूर्त वर्ग है और इसे तत्काल नहीं किया जा सकता है। कक्षा को तत्काल होने के लिए, यह ठोस होना चाहिए (यानी इसके सभी सदस्य कार्यों में कार्यान्वयन होना चाहिए)।

1

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

दूसरी त्रुटि यह है क्योंकि आपके पास कोई BTree :: रूट सदस्य चर नहीं है। आप बीटी के कन्स्ट्रक्टर के भीतर रूट घोषित करते हैं, और फिर जब यह कन्स्ट्रक्टर समाप्त होता है तो यह नष्ट हो जाता है, इसलिए जब आप BTree :: ins के भीतर रूट तक पहुंचने का प्रयास करते हैं, तो रूट दायरे से बाहर होता है (और ऑब्जेक्ट स्वयं नष्ट हो जाता है)।

2

आप एक सार आधार वर्ग की तरह आप BNode के साथ किया है बना सकते हैं और आप एक ठोस व्युत्पन्न वर्ग का निर्माण करना चाहते हैं, तो आप सभी शुद्ध आभासी कार्यों को लागू करना होगा। बीबीआरएएन और बीएलएफ़ दोनों 'डेल' के कार्यान्वयन को याद करते हैं ताकि वे अमूर्त बने रहें।

1

त्रुटि संदेश आपको आवश्यक सभी जानकारी दे रहा है। इसे पढ़ें।

आप प्रकार BBranch की एक चर बनाने के लिए कोशिश कर रहे हैं, लेकिन अपने वर्ग BBranch एक अमूर्त वर्ग, बस BNode, जहाँ से यह से इनहेरिट है की तरह है।

मैं गंध यह एक होमवर्क सवाल है, इसलिए मैं अपने पाठ्यपुस्तक के लिए वापस जाओ और अमूर्त कक्षाएं, कि वे किस तरह इस्तेमाल किया और अधिक महत्वपूर्ण है, क्या "अमूर्तता" समाप्त करने के लिए आवश्यकता होती है के बारे में पढ़ने के लिए प्रोत्साहित करेंगे।