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

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

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

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

04.11.2013, 13:14. Просмотров 285. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2013, 13:14
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Попытка создать обработку событий (C++):

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

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

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

Первая попытка - C++
Ребят, начинаю писать первую игру, ее смысл в том, что ты играешь человечком, бегающем внизу экрана, и сверху на тебя падают камни(бомбы) и...

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

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

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

Добавлено через 6 часов 38 минут
ЛЮДИИИИИИИИИИИИИ
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2013, 21:16
Привет! Вот еще темы с ответами:

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

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

Попытка улучшить действующий код - C++
Добрый день! Появились желающие улучшить действующий код, который по заданной системе многочленов строит её базис Гробнера (по алгоритму...

Попытка реализовать односвязный линейный список - C++
Доброго времени суток! Пробую реализовать односвязный линейный список в виде структуры. #include &lt;iostream&gt; #include &lt;cmath&gt; using...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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