में विभिन्न डेटा प्रकारों को ले जाने के लिए व्युत्पन्न कक्षाओं के लिए सबसे अच्छा तरीका सी ++ में इंटरफ़ेस प्रदान करने का सबसे शानदार तरीका क्या है जो व्युत्पन्न क्लास प्रकारों को स्वीकार करता है जो उनके साथ अलग-अलग डेटा प्रकार के सदस्यों को लेते हैं जिन्हें बाद में पुनर्प्राप्त करने की आवश्यकता होती है। नीचे दिया गया उदाहरण यह दिखाता है कि कंटेनर क्लास एक आइटम "पोस्ट" करने के तरीकों को प्रदान करता है जो बेसइटम के किसी प्रकार का व्युत्पन्न संस्करण होगा। बाद में मैं व्युत्पन्न आइटम वापस प्राप्त करना चाहता हूं और इसके मूल्य को निकालना चाहता हूं।सी ++
मुख्य चीज़ जो मैं चाहता हूं वह कंटेनर इंटरफ़ेस (पोस्ट और प्राप्त) के लिए भविष्य में समान रहने के लिए है, जबकि अलग-अलग "आइटम" व्युत्पन्न प्रकारों को परिभाषित करने और इसके माध्यम से "पारित" करने की इजाजत दी गई है। किसी भी तरह से टेम्पलेट बेहतर होगा; मैं आरटीटीआई का उपयोग नहीं करना चाहूंगा। शायद इसके लिए कुछ सरल, सुरुचिपूर्ण जवाब है, लेकिन अभी मैं इसके बारे में सोचने के लिए संघर्ष कर रहा हूं।
class ItemBase {
// common methods
};
class ItemInt : public ItemBase
{
private:
int dat;
public:
int get() { return dat; }
};
class ItemDouble : public ItemBase
{
private:
double dat;
public:
double get() { return dat; }
};
class Container {
public:
void post(int postHandle, ItemBase *e);
ItemBase* receive(int handle); // Returns the associated Item
};
int main()
{
ItemInt *ii = new IntItem(5);
Container c;
c.post(1, ii);
ItemInt *jj = c.receive(1);
int val = jj->get(); // want the value 5 out of the IntItem
}
Boost.any का प्रयास करें, जो कुछ बहुत समान करता है। –
यह भी ध्यान रखें कि पोस्ट किए गए कोड में प्रत्येक ऑब्जेक्ट की 'get' की समस्या का एक अलग रिटर्न प्रकार होगा। यदि आप उन्हें एक ही प्रकार नहीं बना सकते हैं, तो आपको स्ट्रिंगस्ट्रीम या कुछ वापस करना होगा। –
हां मैं सहमत हूं, लेकिन get() फ़ंक्शन वर्चुअल फ़ंक्शन नहीं है। यह "अलग कार्यक्षमता" है कि प्रत्येक व्युत्पन्न वर्ग "जोड़ता है"। अन्य सामान्य कार्यक्षमता है जो विरासत को "जरूरी" –