![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| KPEHDEL |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 31.3.2010 Репутация: нет Всего: нет |
Здраствуйте, написал класс Button обрабатывающий действия с кнопокой, наведение мыши на неё, нажатие, отжатие...
Информация: Есть метод объявления данных кнопки, x, y, w, h, сурфейса, координат спрайтов. data( int x, int y, int w, int h, SDL_Surface *Surface, SDL_Rect* sprite ); Есть метод обработки нажатия кнопки mouse_button_down(). В этом методе при нажатии кнопки, должен вызываться метод с названием кнопки из класса Event_Button. Например если обрабатывается объект-кнопка Button_Header_Menu_Enter то имя метода из класса Event_Button будет равно имени объекта. Класс Event_Button содержит объект Button_Down и публичные методы имеющие название кнопок. И в методе mouse_button_down() о котором я писал выше, вызывается например так: Button_Event.название_метода(); Вопрос: Как правильно в соответствии с ООП передать название метода, чтобы при нажатии на определённую кнопку вызывался метод с её именем из класса Button_Event, или как это вообще делается? На C++, никогда не писал, ранее писал на C. Теперь встал на путь C++. Поэтому не всегда мне ясно как правильнее сделать в соответствии с ООП. Буду благодарен если направите мои мысли в нужное русло. С нетерпением жду ответа, заранее спасибо. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Почитай: http://qt-project.org/doc/qt-4.8/gettingstarted-develop.html
Это введение в библиотеку Qt. Она написана довольно хорошим стилем и ее архитектура может быть использована как пример. Система сигналов/слотов, правда, там не самая удачная. Поэтому, в своем дизайне можешь использовать boost::signals. |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
Имена методов/классов/переменных в C++ недоступны в runtime (и вообще поддержка RTTI совсем небольшая), так что идентифицировать по имени без специальных бубнов не получится. Но и не надо: каждая кнопка сама знает, какой событие должно сгенерироваться, и просто вызывает соответствующий метод:
Добавлено @ 17:42 а вот если мы хотим связать произвольную кнопку с произвольным событием, потребуется какой-то механизм связывания. та самая система слотов/сигналов. Это сообщение отредактировал(а) baldina - 31.7.2012, 17:44 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
| KPEHDEL |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 31.3.2010 Репутация: нет Всего: нет |
Спасибо, всем ответившим. Направление в котором идти уловил. Буду читать, думать, позже отпишусь о результатах и о том, как сделал.
Это сообщение отредактировал(а) KPEHDEL - 31.7.2012, 18:05 |
|||
|
||||
| Result |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 15.5.2011 Репутация: 2 Всего: 5 |
Кажется забыли дописать паблик наследование. |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
| KPEHDEL |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 31.3.2010 Репутация: нет Всего: нет |
Выбор мой пал всё же не на boost, а на старый добрый Указатель на член. Подходит под задачу и подключать ничего не надо. Но boost::signals скоро тоже понадобится.
Продолжу тему своими следущими вопросами, подходящими под оглавление темы. 1. Информация: Я использую конструктор/деструктор, но также когда требуется создаю метод init() в котором вызывается, то, что должно быть вызвано единажды, а не для каждого объекта. Например: SDL_EnableUNICODE( SDL_ENABLE ); - если вызывать в конструкторе, то после второго вызова для второго объекта, вернёт ошибку. Такое вызываю в методе init(). В конструкторе исключительно то, что требуется инициализировать для каждого объекта. Вопрос: Это нормально? Принято ли так делать в C++ или лучше использовать только конструктор? 2. Информация: Есть объекты класса с конструктором принмающим параметры. Требуется объявить один объект, для которого параметры не нужны. По причине, что через этот объект нужно вызывать просто какой-то метод в методе другого класса. Пример: Где-то вызывается Button.Header_Menu(); А в Header_Menu() вызываются все остальные "нормальные" объекты с параметрами конструктора. Поэтому, объекту проводнику параметры не нужны. Вопрос: В таком случаи делать Button Button( NULL, NULL, NULL, NULL, NULL, NULL, NULL ); или есть другие способы? 3. Информация: Есть конструктор принимающий параметр SDL_Surface* source и объект передающий его. В конструкторе данный параметр присваивается члену класса ClassName::source = source; Есть метод который используя данный член класса должен выводить сурфейс на экран. Например такой:
Однако сурфейс не выводится. Если же передавать сурфейс в метод вывода(в примере это show), там его присвоить члену и попробовать вывести, то сурфейс выведиться на экран Например так:
Вопрос: Подскажите в чём может быть причина? Если требуется больше информации, спрашивайте. С нетерпением жду ответа. Заранее спасибо. Это сообщение отредактировал(а) KPEHDEL - 2.8.2012, 23:19 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
эта функция не имеет ассоциации с объектом. ее бессмысленно вызывать дважды, разве чтоб: SDL_EnableUNICODE(0/1) не понял о чем речь... покажи конструктор. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
|
|||
|
||||
| KPEHDEL |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 31.3.2010 Репутация: нет Всего: нет |
Я о том и писал, в общем я понял, что использовать метод init() и конструктор вместе это нормально...
Речь о том, нормально ли так объявлять объекты, которые, в отличии от других объектов этого же класса не должны иметь параметров.
bsa, пока ничего серьёздного, позже думаю обстоятельства сами заставят перейти на boost::signals, хотя наверное лучше сразу... Это сообщение отредактировал(а) KPEHDEL - 2.8.2012, 23:17 |
||||||||
|
|||||||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
после этой строки добавь:
и в методе StringInput::show() тоже добавь вывод:
ну и сравни значение полученное в конструкторе с тем, что получаешь в StringInput::show(). показывай кодом. все равно не понимаю. |
||||
|
|||||
| Result |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 15.5.2011 Репутация: 2 Всего: 5 |
Можно добавить еще один конструктор т.н. конструктор по умолчанию :
|
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
зачем тогда init - метод этого класса ? Если нужно вызвать что-то один раз сделай так
Это сообщение отредактировал(а) borisbn - 3.8.2012, 13:48 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |