हालांकि पिछले जवाब अपने समाधान के लिए कर रहे हैं, अपने समाधान आपकी समस्या के लिए सही तरह नहीं दिखता है।
मेरे पास दो सुझाव हैं: 1) बेहतर सार आधार वर्ग बनाएं या 2) मज़दूरों के लिए बेस क्लास का उपयोग करें (फ़ंक्शन ऑब्जेक्ट्स)।चलो और अधिक विस्तार में उनकी ओर देखो ...
एक प्रोसेसर के अनुदेश सेट का अनुकरण की एक परियोजना को देखते हुए, हम साथ निष्पादन अनुकरण कर सकते हैं:
struct Instruction_Interface
{
virtual void execute(void) = 0;
};
typedef std::vector<Instruction_Interface *> Instruction_Container;
//...
Instruction_Container::iterator iter;
Instruction_Container program_instructions;
//...
for (iter = program_instructions.begin();
iter != program_instructions.end();
++iter)
{
(*iter)->execute(); // Execute the instruction;
}
यह प्रत्येक अनुदेश के execute
विधि के फोन करने की अनुमति देता है, की परवाह किए बिना निर्देश की तरह। कोई इंटरफ़ेस में और विधियां जोड़ सकता है; इस उदाहरण में कोई "toString" जोड़ सकता है जो निर्देश को पाठ में परिवर्तित करेगा।
Idea 2: Functors
कार्यों आप उपयोग करना चाहते के लिए एक आधार वर्ग या इंटरफ़ेस स्थापित करना। उन्हें एक कंटेनर में रखें और कंटेनर पर फिर से भरें। यात्रा सशर्त भी हो सकता है:
struct Functor_Interface
{
virtual std::string get_name(void) const = 0;
virtual void execute(void) = 0;
virtual void execute_if_name(const std::string& name)
{ if (name == get_name())
{
execute();
}
}
};
typedef std::vector<Functor_Interface *> Functor_Container;
//...
Functor_Container the_functors;
//...
Functor_Container::iterator iter;
for (iter = the_functors.begin();
iter != the_functors.end();
++iter)
{
(*iter)->execute_if_name("loader"); // Execute the functor if it is a *loader*.
(*iter)->execute_if_name("math");
}
सारांश में, अपने डिजाइन पर लगता है कि अगर वहाँ एक बेहतर प्रक्रिया है कि समारोह के नाम की आवश्यकता नहीं है है, लेकिन इसके बजाय या तो समारोह निष्पादित करने के लिए तय कर सकते हैं या सामान्य रूप से अंधा कार्यान्वित को देखने के लिए तरीकों।
स्रोत
2009-12-23 23:17:41
आप पूरा करने के लिए कोशिश कर रहे हैं? –