C++ 有没有更好的方法来创建EventManager

C++ 有没有更好的方法来创建EventManager,c++,sfml,C++,Sfml,我为我的EventManager编写了一个小代码,它工作正常,但问题是,我用大量的复制粘贴创建了它,我认为每次你开始在几行上进行复制粘贴时,你的代码设计都很糟糕 因此,在EventManager上做了大量的复制粘贴之后,我认为是时候找出是否有其他方法来实现它了(可能有,也可能更好) 我实现的是,当事件发生时(window.pollEvent(Event)),它调用EventManager类的onEvent(sf::Event,sf::RenderWindow*)方法,对于我需要侦听的每个事件,我

我为我的
EventManager
编写了一个小代码,它工作正常,但问题是,我用大量的复制粘贴创建了它,我认为每次你开始在几行上进行复制粘贴时,你的代码设计都很糟糕

因此,在
EventManager
上做了大量的复制粘贴之后,我认为是时候找出是否有其他方法来实现它了(可能有,也可能更好)

我实现的是,当事件发生时(
window.pollEvent(Event)
),它调用
EventManager
类的
onEvent(sf::Event,sf::RenderWindow*)
方法,对于我需要侦听的每个事件,我调用侦听器的所有实例

下面是课程:

public:
    void registerKeyPressed(std::shared_ptr<KeyPressedEventListener> listener);
    void registerWindowResized(std::shared_ptr<WindowResizedEventListener> listener);
    void registerWindowFrameUpdate(std::shared_ptr<WindowFrameUpdateEventListener> listener);
private:
    std::vector<std::shared_ptr<KeyPressedEventListener>> m_keyPressedListeners;
    std::vector<std::shared_ptr<WindowResizedEventListener>> m_windowResizedListeners;
    std::vector<std::shared_ptr<WindowFrameUpdateEventListener>> m_windowFrameUpdateListeners;
我必须为每个事件复制此代码。如果有一个bug,你知道要纠正它需要很多工作,所以我希望你能帮助我找到一个更好的方法来实现它


谢谢您的帮助。

您可以使用普通类:

class EventHandler{

public:

    virtual void handle(sf::RenderWindow &window) = 0;
};

class EventManager {

public:
    void registerKeyPressed(std::shared_ptr<EventHandler> listener);
    void registerWindowResized(std::shared_ptr<EventHandler> listener);
    void registerWindowFrameUpdate(std::shared_ptr<EventHandler> listener);
private:
    std::vector<std::shared_ptr<EventHandler>> m_keyPressedListeners;
    std::vector<std::shared_ptr<EventHandler>> m_windowResizedListeners;
    std::vector<std::shared_ptr<EventHandler>> m_windowFrameUpdateListeners;
}
类事件处理程序{
公众:
虚拟空句柄(sf::RenderWindow&window)=0;
};
类事件管理器{
公众:
void registerKeyPressed(std::shared_ptr listener);
无效的寄存器为空(std::shared\u ptr listener);
无效注册表Windows框架更新(std::shared_ptr listener);
私人:
std::向量m_按键监听器;
std::vector m_windowResizedListeners;
std::向量m_windowFrameUpdateListeners;
}
现在可以在类中定义映射,键是事件类型,值是他的侦听器的向量

    std::map<int,std::vector<std::shared_ptr<EventHandler>>*> eventType;
}

//...

EventManager::EventManager(){
    eventType[sf::EventType::Resized] = &m_windowResizedListeners;
    eventType[sf::EventType::KeyPressed] = &m_keyPressedListeners;

    //Keep going...
}
std::map eventType;
}
//...
EventManager::EventManager(){
eventType[sf::eventType::Resized]=&m_windowResizedListeners;
eventType[sf::eventType::KeyPressed]=&m_keyPressedListeners;
//继续。。。
}
现在,OneEvent函数非常简单:

void EventManager::onEvent(sf::Event event, sf::RenderWindow* window) {
    std::vector<std::shared_ptr<EventHandler>>* ptr = eventType[event.type];
    for (int i = 0;i < ptr->size();i++)
        (*ptr)[i]->handle(window);
}
void EventManager::onEvent(sf::事件,sf::RenderWindow*窗口){
std::vector*ptr=eventType[event.type];
对于(int i=0;isize();i++)
(*ptr)[i]->手柄(窗口);
}
让我们举一个例子:

class SettingsSaver : public EventHandler{

   public:
       void handle(sf::RenderWindow &window) override {
           std::cout << "I am saving the state in the hardrive before of exit" << std::endl;
       }
}

class MoveHero : public EventHandler{

   public:
       void handle(sf::RenderWindow &window) override {
           std::cout << "I am moving the character" << std::endl;
       }
}

// Main

std::shared_ptr<EventHandler> settingsSaver(new SettingsSaver);
std::shared_ptr<EventHandler> moveHero(new MoveHero);

EventManager manager;
manager.registerWindowClosed(settingsSaver);
manager.registerKeyPressed(moveHero);
类设置版本:公共事件处理程序{
公众:
无效句柄(sf::RenderWindow和window)覆盖{

std::难道你不能在OneVent中使用window参数吗?我进一步使用它,我只是不想显示6个侦听器的代码,因为这完全是一样的。嗯,谢谢!但是我怎样才能让一个类侦听,比方说,
keyPressed
windowResized
事件?对不起,我有点不好:客户端应该扩展EventHandler类并定义handle()函数的行为。我假设您知道“多态性”和“抽象类”。是的,我知道它^^我只是不知道如何知道它是哪个事件,但我想我将只使用sf::Event参数来检查handle()中的事件函数。@MegalovaniaPowa否否,我将用example@MegalovaniaPowa现在检查一下:)
class SettingsSaver : public EventHandler{

   public:
       void handle(sf::RenderWindow &window) override {
           std::cout << "I am saving the state in the hardrive before of exit" << std::endl;
       }
}

class MoveHero : public EventHandler{

   public:
       void handle(sf::RenderWindow &window) override {
           std::cout << "I am moving the character" << std::endl;
       }
}

// Main

std::shared_ptr<EventHandler> settingsSaver(new SettingsSaver);
std::shared_ptr<EventHandler> moveHero(new MoveHero);

EventManager manager;
manager.registerWindowClosed(settingsSaver);
manager.registerKeyPressed(moveHero);