ошибка времени выполнения при вызове list.clear ()

Я хочу смоделировать C # Event-Driven Programming в Программировании Windows с C ++.

Я хочу сделать это следующим образом:

  1. использовать контейнер списка для сохранения указателей на функции
  2. переопределить оператор + =, сделать класс Event может добавить функцию в
    сюда Событие + = handlerFuncName
  3. переопределить оператор (), чтобы мы могли вызывать функцию в списке

Класс мероприятия:

template<class Sender_Type, class Args_Type>
class Event{
private:
typedef void(*HFUN)(Sender_Type *, Args_Type);
list<HFUN> handlers;
public:
void operator +=(HFUN handler){
handlers.push_back(handler);
}

void operator ()(Sender_Type *sender, Args_Type e){
for (list<HFUN>::iterator it = handlers.begin(); it != handlers.end(); it++)
(*it)(sender, e);
}

~Event(){ printf("Release..\n"); }
};

и вот пример:

определение класса EventArgs и класса окна:

class EventArgs{ };

class Win32Window
{
public:
// event definition
Event<Win32Window, EventArgs> Loaded;

// ctor
Win32Window(){
// ...
// trigger the Loaded event
Loaded(this, EventArgs());
}
// ...
};

определение функции обработчика события:

void Window_Loaded(Win32Window *sender, EventArgs e){
MessageBox(NULL, "Window_Loaded", "xx", 0);
}

основная функция:

Win32Window wnd;
//add the event handler function
wnd.Loaded += Window_Loaded;

Это работает, но когда окно закрывалось, во время выполнения произошла ошибка в list.clear()!
Вот снимок исключения:

0

Решение

Я думаю, что это именно та проблема, std::function был предназначен, чтобы помочь с. Попробуйте что-то вроде этого для начала:

#include <functional>
#include <iostream>
#include <vector>

template <typename Sender, typename... Args>
class Event
{
using FuncType = std::function<void(Sender&, Args...)>;
std::vector<FuncType> vec;

public:
Event& operator+=(FuncType f) {
vec.push_back(f);
return *this;
}

void operator()(Sender& s, Args... a) {
for (auto& f : vec) {
f(s, a...);
}
}
};struct Window
{
Event<Window, int, int> resized;

void resize(int width, int height) {
// blah blah
resized(*this, width, height);
}

};

int main()
{
Window w;

w.resized += [](Window&, int w, int h) {
std::cout << "Window resized to " << w << " by " << h << std::endl;
};

w.resize(800, 600);
}

Обратите внимание, что этот метод позволяет вам использовать не только обычные функции в качестве обработчиков событий, но и лямбды (как показано), а также объекты функций.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector