Tôi đang cố gắng triển khai bus sự kiện an toàn. Tôi bị kẹt với hàm EventBus::subscribe
vì nó không chấp nhận xử lý sự kiện cụ thể của tôi. Trong một phiên bản cũ hơn, tôi chỉ có AbstractEventHandler
được triển khai như một lớp trừu tượng, không có nó là mẫu. Tôi không có vấn đề với việc thực hiện đó. Đó là lý do tại sao tôi giả định rằng vấn đề thực tế là với mẫu trừu tượng.Chức năng C++ không chấp nhận thực hiện cụ thể
Mã bên dưới là phiên bản thực hiện của tôi. Khối đầu tiên bao gồm "bộ xương" của bus sự kiện và các lớp cần thiết của nó trong khi khối thứ hai cho thấy việc thực hiện thực tế của sự kiện, trình xử lý sự kiện và phần chính.
enum
lưu giữ tất cả các sự kiện khác nhau có sẵn. Sự kiện trừu tượng là cơ sở mà tất cả các sự kiện cụ thể đều bắt nguồn từ. Trình xử lý sự kiện là một khuôn mẫu trừu tượng với một sự kiện làm lớp mẫu để đảm bảo an toàn kiểu. Bus sự kiện có trách nhiệm phân phối tất cả các sự kiện đã được công bố cho các trình xử lý tương ứng của nó.
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
}
};
Dưới đây là cụ thể sự kiện và xử lý sự kiện của tôi và chính()
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);
}
Lợi nhuận biên dịch với một lỗi nói rằng không có chức năng phù hợp cho cuộc gọi đến
EventBus::subscribe(EVENT_TYPE, ConcreteEventHandler*)
và rằng các ứng cử viên duy nhất là
void EventBus::subscribe(EVENT_TYPE, AbstractEventHandler<AbstractEvent>*)
Làm cách nào để triển khai EventBus :: phương thức đăng ký để chấp nhận triển khai cụ thể lớp trừu tượng của tôi?
Cập nhật: Giải pháp
Tôi đã thay đổi mô tả phương pháp EventBus::subscribe
như sau và bây giờ công trình độc đáo:
template<typename T>
void subscribe(EVENT_TYPE type, AbstractEventHandler<T> *eventHandler) {
}
Cảm ơn, Rohan, cho gợi ý của bạn! Họ đã giúp tôi tìm ra giải pháp này.
+1 cho câu hỏi hay. –