2010-05-04 20 views
5

में विभिन्न वर्गों की वस्तुओं को पकड़ सकता है, मैं एक सरणी कैसे बना सकता हूं जो सी ++ में विभिन्न वर्गों की वस्तुओं को पकड़ सकता है?एक सरणी बनाना जो सी ++

उत्तर

1

यदि आप अपना खुद का बनाना चाहते हैं, तो टेम्पलेट्स और ऑपरेटर ओवरलोडिंग का उपयोग करके पॉइंटर/सरणी तक पहुंच को लपेटें। नीचे एक छोटा सा उदाहरण है:

#include <iostream> 

using namespace std; 

template <class T> 
class Array 
{ 
private: 
    T* things; 

public: 

    Array(T* a, int n) { 
     things = new T[n]; 
     for (int i=0; i<n; i++) { 
      things[i] = a[i]; 
     } 
    } 

    ~Array() { 
     delete[] things; 
    } 

    T& operator [](const int idx) const { 
     return things[idx]; 
    } 
}; 

int main() 
{  
    int a[] = {1,2,3}; 
    double b[] = {1.2, 3.5, 6.0}; 

    Array<int> intArray(a, 3); 
    Array<double> doubleArray(b, 3); 

    cout << "intArray[1]: " << intArray[1] << endl; 
} 
+0

हालांकि इसमें केवल एक प्रकार प्रति उदाहरण है। मुझे यकीन नहीं है कि एक कंटेनर को कैसे कार्यान्वित किया जाए जो एक उदाहरण में विभिन्न डेटा प्रकारों को स्टोर कर सके। शायद किसी भी तरह फंक्शन टेम्पलेट्स का उपयोग करके? – Nils

12

आप boost::any या boost::variant (दो: [1] के बीच तुलना) का उपयोग कर सकते हैं।

वैकल्पिक रूप से, "विभिन्न वर्गों की वस्तुओं" एक आम पूर्वज (जैसे कि, Base), तो आप इस्तेमाल कर सकते हैं एक std::vector<Base*> (या std::vector<std::tr1::shared_ptr<Base> >), और Derived* लिए परिणाम डाली और जब आवश्यकता होती है।

+1

भी बढ़ावा है: संस्करण। लेकिन जब तक आप वास्तव में असंबंधित वर्गों की वस्तुओं को पकड़ना नहीं चाहते हैं, तब तक मैं इस दृष्टिकोण की अनुशंसा नहीं करता। अन्यथा विकल्प 2 शायद बेहतर है। –

+0

यदि संग्रह ज्ञात है तो मैं 'किसी भी' पर 'संस्करण' की अनुशंसा करता हूं। स्टेटिक चेक एक बड़ी अपील है। यह भी तेज़ है, जो एक अच्छा बोनस है। –

3

आधार वर्ग को परिभाषित करें और अपनी सभी कक्षाओं को इस से प्राप्त करें।

तो फिर तुम के प्रकार (आधार *) एक सूची बना सकते हैं और यह बेस प्रकार की किसी भी वस्तु या व्युत्पन्न प्रकार

+1

इसे बेस क्लास (या कम से कम किसी प्रकार का संदर्भ) के पॉइंटर्स होने की आवश्यकता है, अन्यथा आप ऑब्जेक्ट को बेस पर स्लाइस करेंगे। – Skurmedel

+0

@ स्कुरमेडेल - जाहिर है कि इसे एक सूचक होने की आवश्यकता है। जो इसे मूल्य के रूप में डालने के बारे में सोचेंगे? ... वैसे भी मैं अपना जवाब संपादित करूंगा – SysAdmin

+1

मैं 2 साल पहले :) – Skurmedel

2

boost::fusion पर एक नज़र जो एक STL-प्रतिकृति है है हो सकता है, लेकिन क्षमता के साथ स्टोर करने के लिए कंटेनर में विभिन्न डेटा प्रकार

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