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

С++ для начинающих

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

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

04.11.2013, 13:14. Просмотров 266. Ответов 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 работают. Третий нет.

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

Создать файл («БД») и выполнить его обработку - C++
Формат данных: Поиск в базе данных вида «Фамилия, имя, группа, дата рождения, средний рейтинг» всех студентов, чей средний рейтинг в списке...

Попытка создать первую прогу на языке С++ в Microsoft Visual Studio - C++
Я недавно начала изучать программу Microsoft Visual Studio Ultimate 2010. Изучив основные элементы пытаюсь создать свою первую простенькую...

неудачная попытка программы - C++
Всем здравствуйте раньше программировал на фортране.Сейчас перехожу на Си++ не могу сделать элементарную вещь.Мб туплю где-то дело...

Моя первая попытка - C++
Недавно начала осваивать С++... От бумажного учебника перешла к практике, моя первая попытка решить задачу провалилась... Скажите, в чем...

Попытка разобраться с классами в C++ - C++
Доброго времени суток Читаю книгу Дейтел С++ дошел до классов и в первом же упражнении впал в ступор Помогите кто чем сможет Текст...

Попытка написать простенькую БД - C++
Хочу попробовать написать простенькую БД, но есть некоторые вопросы по реализации. Немогу придумать как реализовать: У каждой ячейки...

первая программа попытка номер три) - C++
здравствуйте! начал читать книгу по c++ там предлагается написать программу для определения возраста. в книге она выглядит так : int main...

Структура / Попытка записи в защищенную память - C++
Доброго времени суток. Смотрите, есть следующий код: struct NewsInfo { int ID; char text; int typepost = -1; }; ...

Задача на обработку - C++
В каждой компоненте файла АБИТУРИЕНТ содержится: − фамилия абитуриента; − номер экзаменационного листа; − оценки (&quot;З&quot;, &quot;4&quot; или...

Попытка чтения или записи в защищенную память - C++
собственно в проблема в заголовке #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; void...


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

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

Добавлено через 6 часов 38 минут
ЛЮДИИИИИИИИИИИИИ
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru