सही जवाब विभिन्न वर्गों, जिनमें से आप चाहते हैं की संख्या पर निर्भर उदाहरण बनाने के लिए।
यदि संख्या बड़ी है (एप्लिकेशन आपके आवेदन में किसी भी वर्ग का उदाहरण बनाने में सक्षम होना चाहिए), तो आपको .Net की प्रतिबिंब कार्यक्षमता का उपयोग करना चाहिए। लेकिन, ईमानदार होने के लिए, मैं व्यवसाय तर्क में प्रतिबिंब का उपयोग करने का बड़ा प्रशंसक नहीं हूं, इसलिए मैं ऐसा करने की सलाह नहीं दूंगा।
मुझे लगता है कि वास्तव में आपके पास कक्षाओं पर सीमित संख्या है जिसके लिए आप उदाहरण बनाना चाहते हैं। और अन्य सभी उत्तर इस धारणा को बनाते हैं। आपको वास्तव में एक कारखाना पैटर्न की आवश्यकता है। अगले कोड में मैं भी मान लेते हैं कि वर्ग है जो की आप उदाहरणों बनाना चाहते हैं, सभी एक ही आधार वर्ग से निकाले जाते हैं, के एनिमल, का कहना है कि इस तरह करते हैं:
class Animal {...};
class Dog : public Animal {...}
class Cat : public Animal {...}
फिर जो एक अंतरफलक है एक सार कारखाना बनाने कि एक जानवर बनाता है:
class IFactory
{
public:
Animal *create() = 0;
};
फिर विभिन्न प्रकार के जानवरों के लिए उप-वर्ग बनाएं। जैसे कुत्ते वर्ग के लिए यह बन जाएगा:
class DogFactory : public IFactory
{
public:
Dog *create() {return new Dog();}
};
और बिल्ली के लिए भी यही है।
डॉगफैक्टरी :: बनाने की विधि IFactory :: बनाने की विधि को ओवरराल करती है, भले ही उनका रिटर्न टाइप अलग हो। यही सह-संस्करण वापसी प्रकार कहा जाता है। जब तक उप-वर्ग की विधि का रिटर्न प्रकार बेस क्लास के रिटर्न प्रकार का उप-वर्ग होता है, तब तक इसकी अनुमति है।सही कारखाना मिल जाए, और उदाहरण बनाने के लिए इसका पूछने के लिए
typedef std::map<char *,IFactory *> AnimalFactories
AnimalFactories animalFactories;
animalFactories["Dog"] = new DogFactory();
animalFactories["Cat"] = new CatFactory();
उपयोगकर्ता इनपुट के बाद, आप है:
अब आप क्या कर सकते हैं किसी नक्शे में इन सभी कारखानों के उदाहरण डाल दिया जाता है, इस तरह जानवर का:
AnimalFactories::const_iterator it=animalFactories.find(userinput);
if (it!=animalFactories.end())
{
IFactory *factory = *it;
Animal *animal = factory->create();
...
}
यह ठेठ अमूर्त कारखाना दृष्टिकोण है। अन्य दृष्टिकोण भी हैं। खुद को सी ++ पढ़ाने के दौरान मैंने इसके बारे में एक छोटा कोडप्रोजेक्ट आलेख लिखा था। आप इसे यहां पा सकते हैं: http://www.codeproject.com/KB/architecture/all_kinds_of_factories.aspx।
शुभकामनाएं।
क्या आप एक (संभावित रूप से छद्म कोड) कोड उदाहरण दे सकते हैं? –
उन्हें कहां बनाएँ? उदाहरण के लिए, आप उन्हें 'std :: vector' में स्टोर कर सकते हैं, लेकिन यह वास्तव में निर्भर करता है कि आप क्या कर रहे हैं। – GManNickG
दुर्भाग्य से सी ++ में आप गतिशील रूप से एक कन्स्ट्रक्टर को कॉल नहीं कर सकते हैं। एकमात्र तरीका उन वस्तुओं को स्टोर करना है जो रनटाइम पर आप जो चाहते हैं उसकी एक नई निर्मित वस्तु वापस करने में सक्षम हैं। आपके द्वारा पहले से प्राप्त किए गए उदाहरण उत्तर पूरी तरह से प्रासंगिक हैं। –