2011-03-05 11 views
6

संक्षिप्त वर्णन:
मैं एक वेक्टर आदेश गतिविधियों का क्रम पर अमल करने में वेक्टर में हर वस्तु पर एक आभासी समारोह बुला से अधिक पुनरावृत्ति कर रहा हूँ। वेक्टर बेस क्लास के रूप में इटेटरेटर है। सभी वस्तुएं बच्चे हैं। जब वर्चुअल फ़ंक्शन कहा जाता है तो यह बेस क्लास के फ़ंक्शन को निष्पादित करता है।आभासी कार्य: पुनरावृत्ति एक वेक्टर <Base Class> कि उपवर्ग के साथ से भर जाता है से अधिक वस्तुओं

(वास्तव में) लंबे विवरण: मैं ऐसे प्राणी को मॉडल करने का प्रयास कर रहा हूं जिसमें व्यवहार का एक सेट है। मेरे आधार वर्ग केवल दो कार्य (आभासी) जो सभी उपवर्गों अधिरोहित है के साथ सार है:

class Behavior 
{ 
public: 
    Behavior(); 
    ~Behavior(void){} 
virtual void execute(){} 
virtual BEHAVIOR_TYPE getType() {return m_Type;} 


protected: 
BEHAVIOR_TYPE m_Type; 
}; 

मैं ऐसे कदम के रूप में बच्चों के व्यवहार, के एक नंबर बनाया है,, उपभोग स्काउट, आदि

class Move : 
    public Behavior 
{ 
public: 
BEHAVIOR_TYPE getType() {return m_Type;} 
    enum Direction {N, NE, E, SE, S, SW, W, NW}; 
Move(DOCO * d); 
~Move(void); 
void execute() ; 
    Direction chooseDirection(); 
    void setDirection(Direction newDirection); 
private: 
    Direction m_Direction; 
    DOCO *I; 
BEHAVIOR_TYPE m_Type; 

}; 

vector<Behavior> m_Behavior; 
vector<Behavior>::iterator bIt; 

प्राणी एक कार्रवाई अनुक्रम हो जाता है, मैं iterat करने की कोशिश:

मैं एक वेक्टर है जिन पर मैं हर व्यवहार उपवर्ग के उदाहरण धक्का दे दिया और साथ ही यह पार करने के लिए पुनरावर्तक बनाया वेक्टर से अधिक ई, इटरेटर भिन्नता है, और फोन पर अमल समारोह:

void World::justDoIt() 
{ 
    for(dIt=myDOCO.begin(); dIt!=myDOCO.end(); ++dIt) 
{ 
    vector<Behavior>::iterator myBehavior=(dIt)->getFirstBehavior(); 
    vector<Behavior>::iterator end=(dIt)->getLastBehavior(); 
    for(myBehavior; myBehavior!=end; ++myBehavior) 

     (*myBehavior).execute(); 
} 
} 

समस्या यह है कि बच्चे के फ़ंक्शन के बजाय माता पिता के समारोह निष्पादित होता है।

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

स्पष्ट रूप से मैंने एक त्रुटि की है और किसी भी तरह से कार्यक्रम को बताया है कि मैं चाहता हूं कि इन्हें बच्चों के बजाय माता-पिता के रूप में माना जाए, लेकिन मुझे मेरी त्रुटि नहीं मिल रही है।

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

किसी भी मदद की सराहना की जाएगी।

+0

वहाँ एक में आधार वर्ग _objects_ (बल्कि _pointers_ से) डालने के लिए ड्यूप्स के दर्जनों होना चाहिए एसटीएल कंटेनर, हालांकि मैं नहीं कर सकता, एटीएम, एक ढूंढें। उनमें से एक शायद [एफएक्यू एंट्री] बनना चाहिए (http://stackoverflow.com/questions/tagged/c%2b%2b-faq)। – sbi

उत्तर

10

कक्षा vector<Behavior> प्रतिलिपि बनाने वाले Behavior::Behavior(const Behavior&); का उपयोग करके आप जो भी स्टोर करते हैं उसकी प्रतियां बनाते हैं। यह बहुरूपता को नष्ट कर देता है। ,

vector<Behavior*> m_Behavior; // I will take care of new and delete 
vector<shared_ptr<Behavior> > m_Behavior; // easier 

आप #include <memory> या इसी तरह के std::shared_ptr या std::tr1::shared_ptr नहीं है, तो हो सकता है आप बूस्ट का उपयोग कर सकते हैं: आप के बजाय कंटेनर में एक सूचक या स्मार्ट सूचक का उपयोग करने की जरूरत है।

+0

आपको बहुत बहुत धन्यवाद! मुझे साझा पॉइंटर्स के बारे में पता नहीं था! – Sisyphus

+2

यदि आपके पास 'std :: shared_ptr' है, तो यहां 'std :: unique_ptr' का उपयोग करें। –

4

आप वेक्टर में कक्षाओं के जोड़ रहे हैं। इसके परिणामस्वरूप slicing है।

आप क्या करने की जरूरत व्यवहार के उदाहरण के लिए संकेत जोड़ सकते हैं और ऐसा करने के लिए लूप को संशोधित है

(*myBehavior)->execute(); 
+0

आपको बहुत बहुत धन्यवाद! – Sisyphus

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