2012-02-01 22 views
6

मैं व्युत्पन्न वस्तुओं की ओर इशारा का एक वेक्टर उपयोगकर्ता (ताकि मुझे लगता है कि सही शब्द "है केवल क्रम में जाना जाता है) ::उपयोग व्युत्पन्न वर्ग

vector<Person *> vect; 

द्वारा डालने के बीच तुलना करने के लिए व्युत्पन्न वर्ग पुरुष और महिला हैं मैं केवल महिला ऑब्जेक्ट का चयन करके इस बात का copyconstructor कॉल करने के लिए वेक्टर पर एक यात्रा बनाना चाहते मैंने सोचा था कि 3 समाधान:

  1. एक ध्वज का उपयोग करने के लिए;
  2. ।। टाइपिड
  3. का उपयोग करने के लिए महिला के डिफ़ॉल्ट कन्स्ट्रक्टर में कॉपी कन्स्ट्रक्टर को कॉल करने के लिए, इसलिए जब भी उपयोगकर्ता एक बनाता है, स्वचालित रूप से जुड़वां बना देता है।

मुझे कई तरह के व्युत्पन्न कक्षाओं के मामले में पहला विकल्प पसंद नहीं है। मुझे तीसरा विकल्प भी पसंद नहीं है क्योंकि रिश्ते की समस्या पैदा होगी (दुनिया हर महिला को जानता है लेकिन महिला दुनिया को नहीं जान सकती)। उदाहरण

typeid(vect.at(i))==typeid(Female) 

इस अभिव्यक्ति सही है: तो मैं दूसरे विकल्प का उपयोग करना चाहिए? क्या समस्या को रेखांकित करने का कोई और तरीका है?

+5

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

+1

'टाइपिड (vect.at (i)) == टाइपिड (महिला) 'काम नहीं करेगा –

+0

मैं @ आर। मार्टिन्होफर्नैंड्स से सहमत हूं, लेकिन यदि आप अभी भी एक गतिशील कलाकार की तुलना में बहुरूपता का प्रयास कर सकते हैं तो यहां उपयोगी हो सकता है। – L7ColWinters

उत्तर

7

होने Male और Person से Female इनहेरिट एक बहुत अजीब डिजाइन की तरह लगता है, लेकिन यहाँ हम चले:

vector<Person*> vect; 
vector<Female*> females; 
for (vector<Person*>::const_iterator it = vect.begin(); it != vect.end(); ++it) 
{ 
    if (Female* p = dynamic_cast<Female*>(*it)) 
    { 
     females.push_back(p); // copy the pointer 
    } 
} 

तुम सच में महिला है, जो फिर से अजीब लगता है की एक प्रति प्रदर्शन करने के लिए चाहते हैं, पिछले की जगह लाइन के साथ:

 females.push_back(new Female(*p)); // copy the pointee 
+0

मुझे इसे लिखना याद नहीं आया लेकिन व्यक्ति एक अमूर्त वर्ग है। आपका कोड यह अच्छा है लेकिन मुझे क्लोन फ़ंक्शन पर कॉल के साथ (नई महिला (* पी)) को बदलना है, मुझे लगता है कि – Ale

+1

क्यों? 'Push_back' के बिंदु पर, आप पहले से ही * जानते हैं कि आपके पास 'महिला' है। या क्या 'मादा' के पास और उप-वर्ग हैं? * केवल तब * एक पॉलिमॉर्फिक क्लोन फ़ंक्शन को कॉल करना समझ में आता है। – fredoverflow

+0

हाँ, आप सही हैं! – Ale

3
typeid(vect.at(i))==typeid(Female) 

गलत है यदि vect में पॉइंटर्स हैं। आप

typeid(*vect.at(i)) == typeid(Female)) 

चाहे typeid या एक सरल झंडा इस्तेमाल किया जाना चाहिए कि क्या आप वास्तव में बहुरूपता की जरूरत है पर, अपने कार्यक्रम की वास्तुकला पर निर्भर करता है विशेष रूप से मतलब है। मैं वास्तव में आपके तीसरे विकल्प को समझ नहीं पा रहा हूं।

+0

तीसरा विकल्प शायद काम नहीं करता है लेकिन मालिक कॉपी कॉपी कन्स्ट्रक्टर को कॉल करने के लिए महिला के लागतकर्ता में क्लोन फ़ंक्शन डालने के लिए होता है। वैसे भी, मैं टाइपिड या गतिशील कलाकार पसंद करते हैं। धन्यवाद – Ale

3

विरासत के साथ लिंग मॉडल न करें, बल्कि Person में एक गणित प्रकार का उपयोग करें। फिर आप transform या remove_copy_if या मादा संकेतित वस्तुओं को ढूंढने के समान उपयोग कर सकते हैं।

1

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

Person *pp; 
Female *fp; 
// ... 
fp = dynamic_cast<Female *> (pp); 
if (fp) 
    fp->DoFemaleThing(); 
else 
    cout << "Cast from Person to Female pointer failed"; 
संबंधित मुद्दे