2009-11-07 8 views
6

मैं std::map या वेक्टर के भीतर अपनी कक्षाएं पंजीकृत करने में सक्षम होना चाहता हूं, डुप्लीकेट्स के बारे में नहीं सोचें और ऐसे में, लेकिन मैं इसे पंजीकृत नहीं करना चाहता कक्षा कन्स्ट्रक्टर कॉल या कक्षा के किसी भी समारोह के भीतर, किसी भी तरह से कक्षा के बाहर ऐसा करते हैं, भले ही मैं इसे कभी भी चालू नहीं करता, मैं यह जान सकूंगा कि यह अस्तित्व में है।किसी भी तरह से मेरी कक्षाओं को एक सूची में पंजीकृत करें

उदाहरण:

// Somehow, from outside the myclass, in a scope that will be called 
//in the begining of the proccess, add "MyClass1" to a 
//list so it can be instanciated later 
class MyClass1{ 

} 

तो मैं इसके बारे में एक #define या सक्षम हैं, एक टेम्पलेट बनाना होगा।
मुझे नहीं पता कि मैंने खुद को स्पष्ट कर दिया है (0) मेरा मुद्दा यह है कि मुझे हर वर्ग को जानने की ज़रूरत है जो मुझे हर किसी को कॉल करने के बिना है।
मेरा विचार यह आसान वर्ग के शीर्षक की घोषणा और कुछ है कि एक सूची

है कि विशिष्ट वर्ग रजिस्टर होगा इस किया जा सकता है कॉल करने के लिए बनाने के लिए एक #define का निर्माण करना था या मैं इसे मैन्युअल मैप करने के लिए करना होगा?

// desirable: 
#define CLASSREGISTER(myclass) makethemagic(##myclass); class myclass { 
}; 

मुझे पता है, उस के साथ परिभाषित मैं उपयोग नहीं कर सका विरासत आदि ... मेरी बात मैं क्या किसी भी तरह बनाने के लिए सोच रहा था का एक उदाहरण देने की कोशिश करने के लिए था ...

+0

मुझे लगता है कि आपको 'डिज़ाइन-पैटर्न' टैग जोड़ना चाहिए। – Alexandru

उत्तर

9

यहाँ विधि है एक वेक्टर के अंदर कक्षाओं के नाम रखने के लिए। अगर मैं महत्वपूर्ण विवरण याद करता हूं तो एक टिप्पणी छोड़ दो। मुझे नहीं लगता कि यह टेम्पलेट्स के लिए काम करेगा, हालांकि।

struct MyClasses { 
    static vector<string> myclasses; 
    MyClasses(string name) { myclasses.push_back(name); } 
}; 

#define REGISTER_CLASS(cls) static MyClasses myclass_##cls(#cls); 

struct XYZ { 
}; 

REGISTER_CLASS(XYZ); 

चाल यहाँ मुख्य पहले कुछ गणना() कहा जाता है बनाने के लिए है और आप वैश्विक आरंभीकरण के माध्यम से इस लक्ष्य को हासिल कर सकते हैं। REGISTER_CLASS (सीएलएस) वास्तव में प्रोग्राम स्टार्टअप पर MyClasses के निर्माता को कॉल करने के लिए कोड उत्पन्न करता है।

अद्यतन: निम्नलिखित gf सुझाव आप इस लिख सकते हैं:

#define REGISTER_CLASS(cls) temp_##cls; static MyClasses myclass_##cls(#cls); class cls 
class REGISTER_CLASS(XYZ) { int x, y, z; } 
+0

क्षमा करें, लेकिन मुझे समझ में नहीं आया ... मैं आपके कोड के साथ कक्षा घोषित करने के लिए कैसे करूं? – Jonathan

+0

std :: string/string – ScottJ

+0

@ जोनाथन को छोड़कर: XYZ के बारे में उदाहरण पोस्ट किया गया। क्या आप यही चाहते थे? – Alexandru

-2

उपयोग को बढ़ावा देने :: एमपीएल, वेक्टर या नक्शा।

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