Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
32 / 13 / 3
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
1

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

04.11.2013, 13:14. Показов 478. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Попытался создать что-то наподобии сигналов и слотов.

Вот мой файл 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2013, 13:14
Ответы с готовыми решениями:

System.AccessViolationException: Попытка чтения или записи в защищенную память - попытка 3
Уже простите за некомпилируемый код, просто я переустановил Windows, и Visual Studio удалилась,...

System.AccessViolationException: Попытка чтения или записи в защищенную память - попытка 2
В предыдущей теме некто вообразил, что код зацикливается, поэтому приходится выкладывать более...

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

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

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

Добавлено через 6 часов 38 минут
ЛЮДИИИИИИИИИИИИИ
0
04.11.2013, 21:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2013, 21:16
Помогаю со студенческими работами здесь

Создать класс, который производит обработку двумерного массива
Создать класс, который производит обработку двумерного массива. Выбивает две ошибки: 1)...

Создать динамический массив. ввод,вывод и обработку элементов массива реализовать через функции
создать динамический массив. ввод,вывод и обработку элементов массива реализовать через функции

ToolTip тормозит обработку событий формы
В общем при событии MouseMove над определенным контроллом вывожу ToolTip ...

Как на время отключить обработку событий кнопок?
На форме есть две кнопки Btn1 и Btn2. При клике по Btn1 производятся достаточно длительные расчеты....


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru