![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Нитонисе |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: нет Всего: 2 |
Пишу класс
Этот код конечно не работает, просто что бы пояснить чего я хочу. А хочу я иметь членом класса некую функцию func, реализация которой может быть произвольной. Ну вот например:
Как это сделать? |
||||
|
|||||
EvilsInterrupt |
|
||||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Нитонисе,
1)
Это верно? Если оформить по красивее, то:
2) Почему в setFunc присваиваете в переменную "void *func;", а в DoFunc() дергаете какую-то мифическую f() ? 3) Может Вам изучить понятие "функтор" ? Другие названия этого термина "Объект функции". Это класс с переопределенным оператором "круглые скобки", чтобы объект этого класса вел себя как функция. Т.е. "все что выглядит как функция, ведет себя как функция = есть функция" |
||||
|
|||||
Нитонисе |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: нет Всего: 2 |
С оформлением я не заморачивался, потому как писал прямо в форме ответа. Соответственно и опечатку в DoFunc допустил. А вот по п.3 видно надо изучать матчасть.
|
|||
|
||||
NoviceF |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: нет Всего: 2 |
что-то похожее на то, что ты хочешь, есть в паттерне "Стратегия" http://ru.wikipedia.org/wiki/%D0%A1%D1%82%...BD%D0%B8%D1%8F) вот кусок кода оттуда
в моём понимании произвольной может быть реализации, но интерфейс должен быть фиксированным. В случае с функцией, фиксированной должна быть сигнатура. Ну то есть здесь
void *func; должен быть указателем на какую-то конкретную сигнатуру, и присваивать ему мы дожны функции с такой же сигнатурой, но, если требуется, различным поведением. Хотя на практике не сталкивался, но по идее должно работать ![]() Это сообщение отредактировал(а) NoviceF - 4.1.2013, 16:09 |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
понятие функция может быть легко расширено до функционального обьекта и это расскрывает новые свободы, о чeм уже было сказано выше.. для ознакомления с подобной концепцией см. [boost:: / (c++11)std::] function и bind.. Добавлено через 2 минуты и 16 секунд
для простой функции никаких наворотов не требуется, всe работает из коробки ) |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Нитонисе,
Поясни какую проблему ты решаешь? Для чего потребовался такой код? Возможно есть решение проще. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот набросок :
|
|||
|
||||
NoviceF |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: нет Всего: 2 |
![]() |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
NoviceF,
По моему никнейму поищи недавнюю тему, которую я создал. В ней про функторы достаточно много рассказано |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
глянуть хотя бы на стл :
http://liveworkspace.org/code/409lqK$0 Добавлено через 3 минуты и 54 секунды если вместо 10 и 15 поставить переменные, то реализовать подобное через указатели на функции будет затруднительно.. Добавлено через 6 минут и 52 секунды ну а с лямбдой, как дальнейшее развитии функтора, выглядит еще удобнее : http://liveworkspace.org/code/409lqK$2 Добавлено через 9 минут и 31 секунду ну и с замыканием контекста : http://liveworkspace.org/code/409lqK$3 все это приведенно на скорую руку, на самом деле преимущества гораздо шире ) |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
mes,
Я бы предпочел так оформить код:
Понятней как-то... ) |
|||
|
||||
NoviceF |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: нет Всего: 2 |
Спасибо за примеры, но представление о функторах и лямбдах я имею
![]() Это сообщение отредактировал(а) NoviceF - 4.1.2013, 23:47 |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
NoviceF,
Польза от использования функторов в том что это объекты! А объекты имеют состояние. То есть перед подачей объекта куда-либо ты можешь его про инициализировать, а после того как это "куда-либо" отработало ты еще можешь прочитав его состояние знать результат какой-угодно тебе. Рекомендую книгу Джосьютиса "Стандартная библиотека C++". Сам читаю, очень опечален тем что раньше ее не прочитал ((( |
|||
|
||||
NoviceF |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: нет Всего: 2 |
спасибо, учту.
хороших книжек много и читаю я их не быстро ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
![]() по данному классу сказать проблематично, так как требования по задаче не сформурлированы, а я увы не телепат ![]()
грубо говоря, да ![]() ![]() Это сообщение отредактировал(а) mes - 5.1.2013, 04:07 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |