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

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

Восстановить пароль Регистрация
 
Egor138
 Аватар для Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
04.11.2013, 13:14     Попытка создать обработку событий #1
Попытался создать что-то наподобии сигналов и слотов.

Вот мой файл 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 работают. Третий нет.

Для его реализации я создал пустую структуру на которую нужно ссылкатся (так как отправителя сигнала нет). Но почему то этот способ не работает. Уже второй день не могу найти проблему.
Помогите пожалуйста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2013, 13:14     Попытка создать обработку событий
Посмотрите здесь:

C++ Попытка создать первую прогу на языке С++ в Microsoft Visual Studio
первая программа попытка номер три) C++
C++ Попытка чтения или записи в защищенную память
неудачная попытка программы C++
Создать динамический массив. ввод,вывод и обработку элементов массива реализовать через функции C++
Попытка написать простенькую БД C++
Моя первая попытка C++
C++ Создать файл («БД») и выполнить его обработку

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Egor138
 Аватар для Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
04.11.2013, 13:18  [ТС]     Попытка создать обработку событий #2
Вот эта ошибка
Миниатюры
Попытка создать обработку событий  
Egor138
 Аватар для Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
04.11.2013, 21:16  [ТС]     Попытка создать обработку событий #3
Ну хоть кто-нибудь

Добавлено через 6 часов 38 минут
ЛЮДИИИИИИИИИИИИИ
Yandex
Объявления
04.11.2013, 21:16     Попытка создать обработку событий
Ответ Создать тему
Опции темы

Текущее время: 04:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru