Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Попытка создать обработку событий - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Демографическая модель Мальтуса http://www.cyberforum.ru/cpp-beginners/thread997359.html
Добра вам, дорогие форумчане. Нужно написать программу, которая по заданным параметрам будет строить демографическую модель Мальтуса Параметры которые можно менять: коэффициент рождаемости,...
C++ Разработка библиотеки на С++ работа со списками Требуется разработать библиотеку com для работы с полуторосвязным списком(где каждый элемент имеет указатель на следующий и только каждый 10ый имеет указатель назад) в этой библиотеке должны быть все... http://www.cyberforum.ru/cpp-beginners/thread997348.html
Решение задачи C++
Имеется задача: Имеем К квадратных плиток. Из них нужно выложить прямоугольник высотой H и шириной W плиток. Вариантов, как вы понимаете, немало. Но каждый прямоугольник имеет свой ​​код. Этот код...
Сортировка слиянием C++
Пожалуйста можете предоставить код сортировки слиянием, который будет считывать массив с N чисел, а возвращать упорядоченный массив. Скажите будет ли сортировка слиянием работать быстрее или...
C++ Задан массив целых чисел. Определить, сколько процентов от всего количества элементов исходного массива составляют нечётные элементы http://www.cyberforum.ru/cpp-beginners/thread997334.html
Что-то я совсем не так делаю. Помогите разобраться. Заранее большое спасибо. #include <iostream>; #include<stdlib.h>; using namespace std; int main() { setlocale(LC_ALL, "Rus"); int i,...
C++ free Выделил память под массив(строку), размером 5 элементов. char *str; str = (char*)calloc(5,sizeof(char)); if (str == NULL) { cout<<"ERROR"<<endl; exit(1); } По мере ввода строки,... подробнее

Показать сообщение отдельно
Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2

Попытка создать обработку событий - C++

04.11.2013, 13:14. Просмотров 268. Ответов 2
Метки (Все метки)

Попытался создать что-то наподобии сигналов и слотов.

Вот мой файл Event.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#ifndef ELEM_H
#define ELEM_H
#include <vector>
#include "Delegate.h"
using std::vector;
 
struct Empty{};
extern Empty e1;
 
class EventContainer {public: virtual ~EventContainer() {}};
template< class A >
class IEventContainer : public EventContainer
{
public:
    IEventContainer(A &reciv, Delegate& deleg) : reciv_(&reciv), deleg_(&deleg), slot_(NULL)
    {};
 
    IEventContainer(A &reciv, void(*slot)(void)) : reciv_(&reciv), deleg_(NULL), slot_(slot)
    {};
 
    template< class B >
    void compute(B* reciv)
    {
        if(reciv != reciv_) return;
        if(deleg_ == NULL) slot_();
        else (*deleg_)();
    }
 
    A *reciv_;
    Delegate *deleg_;
    void(*slot_)(void);
};
 
class Event
{
public:
    Event() {};
 
    void push(EventContainer* element) 
    {
        container.push_back(element);
    }
 
    template< class A >
    void operator()(A *reciv)
    {
        for(size_t i=0; i<container.size(); i++)
        {
            IEventContainer<A>* temp = dynamic_cast<IEventContainer<A>*>(container[i]);
            temp->compute(reciv);
        }
    }
 
private:
    vector<EventContainer*> container;
};
 
template< class A, class B, class C>
void Connect(A &reciv, Event& signal, B &tranc, C slot)
{
    Delegate *temp = new Delegate;
    temp->Connect(&tranc, slot);
    IEventContainer<A> *element = new IEventContainer<A>(reciv, *temp);
    signal.push(element);
}
 
template< class A, class B>
void Connect(A &reciv, Event& signal, B slot)
{
    IEventContainer<A> *element = new IEventContainer<A>(reciv, slot);
    signal.push(element);
}
 
template< class A >
void Connect(Event& signal, A slot)
{
    IEventContainer<Empty> *element = new IEventContainer<Empty>(e1, slot);
    signal.push(element);
}
 
 
namespace Signal
{
    extern Event show;
}
using namespace Signal;
 
#endif

Если я проверяю все это так все работает

C++
1
2
3
4
5
6
7
8
9
void main()
{
    Window w1(Coord(5, 5), Size(10, 10));
    Window w2(Coord(15, 15), Size(10, 10));
 
 
    Connect(w1, show, w2,  &Window::show);
    w1.show();
}
Вот так тоже все замечательно

C++
1
2
3
4
5
6
7
8
9
void main()
{
    Window w1(Coord(5, 5), Size(10, 10));
    Window w2(Coord(15, 15), Size(10, 10));
 
 
    Connect(w1, show, &fun);
    w1.show();
}

А при записи без отправителя сигнала вылетает ошибка после запуска программы

C++
1
2
3
4
5
6
7
8
9
void main()
{
    Window w1(Coord(5, 5), Size(10, 10));
    Window w2(Coord(15, 15), Size(10, 10));
 
 
    Connect(show, &fun);
    w1.show();
}


У меня возможны 3 вида обработки:

1)Если объект отправил сигнал, то объект выболняет метод
2)Если объект отправил сигнал, то выполняется функция
3)Если отправлен (не важно от кого) сигнал, то выполняется функция

Первые 2 работают. Третий нет.

Для его реализации я создал пустую структуру на которую нужно ссылкатся (так как отправителя сигнала нет). Но почему то этот способ не работает. Уже второй день не могу найти проблему.
Помогите пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru