मैं एक सामान्य बेस क्लास की वस्तुओं की तुलना करने की कोशिश कर रहा हूं। जब किसी ऑब्जेक्ट में कक्षाएं भिन्न होती हैं, या ऑब्जेक्ट के लिए विशिष्ट मानों में भिन्न होती हैं तो तुलना विफल होनी चाहिए (उदाहरण के लिए विफलता स्ट्रिंग आउटपुट)। आदर्श रूप से तुलना किसी भी तरह लागू होती है, जैसे कि एक नई व्युत्पन्न कक्षा को भी अपनी कक्षा के सदस्यों को तुलनात्मक कार्य लिखना होगा। यहाँ एक कोड उदाहरण है:सी ++ में गतिशील कास्टिंग या स्थैतिक डाउनकास्टिंग के बिना व्युत्पन्न कक्षाओं की तुलना
#include <iostream>
#include <string>
#include <vector>
class Vehicle
{
public:
virtual std::string compareTo(Vehicle* v) = 0;
};
class Bicycle : public Vehicle
{
public:
Bicycle() { color_ = "red"; }
std::string compareTo(Vehicle* v) { return "We're different vehicles."; }
std::string compareTo(Bicycle* b) { return color_.compare(b->color_) ? "We're different bicycles." : "We're the same bicycle."; }
private:
std::string color_;
};
class Car : public Vehicle
{
public:
Car() { style_ = "sedan"; }
std::string compareTo(Vehicle* v) { return "We're different vehicles."; }
std::string compareTo(Car* c) { return style_.compare(c->style_) ? "We're different cars." : "We're the same car."; }
private:
std::string style_;
};
int main()
{
Vehicle* compareFrom = new Bicycle();
std::vector<Vehicle*> compareTos;
compareTos.push_back(new Bicycle());
compareTos.push_back(new Car());
std::vector<Vehicle*>::iterator it;
for (it = compareTos.begin(); it != compareTos.end(); ++it)
std::cout << compareFrom->compareTo(*it) << std::endl;
return 0;
}
वर्तमान में, निर्गम (आप here देख सकते हैं जो) कहते हैं, "हम अलग-अलग वाहनों रहे हैं"। मुझे पता है कि यह हो रहा है क्योंकि मैं सार आधार सूचक का उपयोग कर रहा हूँ। समस्या यह है कि इसे कैसे ठीक किया जाए!
आउटपुट मैं की तरह यह है कि साइकिल उत्पादन यह है कि वे समान हैं, क्योंकि उनके पास एक ही रंग है। साइकिलें और कारों को आउटपुट करना चाहिए कि वे अलग-अलग वाहन हैं। विभिन्न रंगों और विभिन्न शैलियों की कारों की साइकिलें यह भी आउटपुट करनी चाहिए कि वे अलग हैं। मुझे लगता है कि इस समस्या को हल करने के लिए उपयोग करने के लिए एक महान पैटर्न होना चाहिए, लेकिन मैं गतिशील कास्टिंग या असुरक्षित डाउनकास्ट मुद्दों में फंस गया हूं। इसके अलावा, मैं एक ही कक्षा के सदस्यों के बीच तुलना समारोह को लागू करना चाहता हूं (इसलिए साइकिलें अन्य साइकिलों की तुलना में सक्षम होनी चाहिए)।
मेरा बुरा, ध्यान दें कि string.compare() स्ट्रिंग मैच के दौरान 0 लौटाता है। –
आप गतिशील कास्टिंग में खुद को 'फेंक' क्यों मानते हैं? – Macke
@ मैके मैंने जो पढ़ा है, उससे "उचित" ऑब्जेक्ट उन्मुख डिजाइन में गतिशील कास्टिंग आवश्यक नहीं होना चाहिए। चूंकि मैं इस डिजाइन को जमीन से कर रहा हूं, मैं इसे सही करना चाहता था! – aardvarkk