मैं एक टाइपएफ़ ईवेंट बस को लागू करने की कोशिश कर रहा हूं। मैं EventBus::subscribe
फ़ंक्शन के साथ फंस गया हूं क्योंकि यह मेरे ठोस ईवेंट हैंडलर को स्वीकार नहीं करता है। पहले के संस्करण में मेरे पास AbstractEventHandler
केवल एक सारणी वर्ग के रूप में लागू किया गया था, बिना टेम्पलेट के। मुझे उस कार्यान्वयन में कोई समस्या नहीं थी। यही कारण है कि मुझे लगता है कि वास्तविक मुद्दा सार टेम्पलेट के साथ है।सी ++ फ़ंक्शन कंक्रीट कार्यान्वयन स्वीकार नहीं करता
नीचे दिया गया कोड मेरे कार्यान्वयन का एक अलग संस्करण है। पहला ब्लॉक घटना बस और इसके आवश्यक वर्गों के "कंकाल" से मिलता है जबकि दूसरा ब्लॉक घटना, घटना हैंडलर और मुख्य का वास्तविक कार्यान्वयन दिखाता है।
enum
सभी अलग-अलग आयोजन उपलब्ध हैं। अमूर्त घटना वह आधार है जिसमें से सभी ठोस घटनाएं उत्पन्न होती हैं। इवेंट हैंडलर एक सारणी टेम्पलेट है जो टेम्पलेट क्लास के रूप में एक ईवेंट के साथ टाइप-सुरक्षा सुनिश्चित करता है। इवेंट बस सभी प्रकाशित कार्यक्रमों को अपने संबंधित हैंडलरों को वितरित करने के लिए ज़िम्मेदार है।
enum EVENT_TYPE
{
ON_EVENT_1,
ON_EVENT_2
};
class AbstractEvent
{
public:
AbstractEvent() {};
virtual ~AbstractEvent() {};
virtual EVENT_TYPE type() = 0;
};
template<class T>
class AbstractEventHandler
{
public:
AbstractEventHandler() {};
virtual ~AbstractEventHandler() {};
virtual void on_event(T *event) = 0;
};
class EventBus
{
public:
EventBus() {};
virtual ~EventBus() {};
void subscribe(EVENT_TYPE type,
AbstractEventHandler<AbstractEvent> *eventHandler) {
// Add handler to vector for further use
}
void publish(AbstractEvent *event) {
// send event to each handler in respective vector
}
};
नीचे मेरी ठोस घटना और ईवेंट हैंडलर और मुख्य()
class ConcreteEvent : public AbstractEvent
{
public:
ConcreteEvent() {};
virtual ~ConcreteEvent() {};
EVENT_TYPE type() {
return ON_EVENT_1;
};
};
class ConcreteEventHandler : public AbstractEventHandler<ConcreteEvent>
{
public:
ConcreteEventHandler() {}
virtual ~ConcreteEventHandler() {};
void on_event(ConcreteEvent *event) {
// Do something
};
};
int main()
{
EventBus *eventBus = new EventBus();
ConcreteEventHandler handler = ConcreteEventHandler();
// This failes!
eventBus->subscribe(ON_EVENT_1, &handler);
}
एक त्रुटि कह
EventBus::subscribe(EVENT_TYPE, ConcreteEventHandler*)
करने के लिए कॉल के लिए कोई मिलता-जुलता समारोह है कि वहाँ के साथ संकलक रिटर्न हैं और यह कि केवल उम्मीदवार
void EventBus::subscribe(EVENT_TYPE, AbstractEventHandler<AbstractEvent>*)
मैं अपनी सार कक्षा के ठोस कार्यान्वयन को स्वीकार करने के लिए अपनी EventBus :: सदस्यता विधि कैसे कार्यान्वित कर सकता हूं?
अद्यतन: अपने संकेत के लिए
template<typename T>
void subscribe(EVENT_TYPE type, AbstractEventHandler<T> *eventHandler) {
}
धन्यवाद, रोहन,: समाधान
मैं निम्नलिखित करने के लिए EventBus::subscribe
की विधि विवरण बदल दिया गया है और अब अच्छी तरह से काम करता है! उन्होंने मुझे इस समाधान को खोजने में मदद की।
+1। –