| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Реализация событий в С++ |
| Автор: sofenru 2.11.2010, 08:52 |
| Мне нужно реализовать события, как в Дельфи или С++ Builder, на Visual C++. Но стандартный С++ не поддерживает указатели на функции-члены класса. В своём блоге http://c3plus.ru за 02.11.10, я попытался расписать, как это можно было бы реализовать, но получилось уж слишком громоздко... А как сделать проще? |
| Автор: mes 2.11.2010, 09:33 | ||
или хотя бы разбавляйте фразами типа: "как мне представляется", "хотя я не до конца разобрался в вопросе", "учитывая мой недолгий опыт" |
| Автор: xvr 2.11.2010, 12:09 |
| ТС 'слегка' перепутал closure указатели с member указателями, а судя по его блогу, он еще много чего перепутал |
| Автор: Леопольд 2.11.2010, 12:46 |
| sofenru, читаю Ваш блог, и посещает меня, уже забытое чуство стыда. Это психологический эксперимент на сопереживание? |
| Автор: Alexeis 2.11.2010, 13:15 | ||
| Сигналы это уже тяжелая артиллерия. Можно чуть более просто boost::function - описываем тип-шаблон события. boost::bind - шаблонная функция для связывания Вот пример связывания объектного обработчика с событием
результат bind будет объект типа boost::function<> ; Безусловно этот способ не очень красивый и прозрачный, но использовать можно. |
| Автор: sofenru 2.11.2010, 14:38 | ||||||
Ну так... не поддерживается... ))) Иначе, зачем тогда всё это реализовывать с помощью библиотеки boost??? Так как я пишу свою библиотеку, то завязывание на чужие либы (будь то буст или другая) никак не приемлемо... Я всем представляю либу, которая будет весить едва ли метр, но для её работы необходимо скачать несколько различных других библиотек на десятки или сотни килобайтов)))
Поясните, плиз, подробнее.. что я перепутал в этот раз?
думаю, что нет.... в такой форме намного веселее писать сложные программы... тем более, что мой проект просто обречён на успех!!! |
| Автор: azesmcar 2.11.2010, 14:43 | ||||
опять...каким образом связаны сигналы и указатели на функцию-член? ты хоть по ссылке зашел в google? почитал?
ну ну..желаю удачи в разработке сотни тысяч велосипедов.
поверь мне, кроме тебя твоя либа никому не нужна, а boost сегодня есть практически у каждого C++ программиста. |
| Автор: Master01 2.11.2010, 14:45 |
ну вес либы не принципиален |
| Автор: Alexeis 2.11.2010, 15:04 | ||
Для того чтобы упростить синтаксис и избежать написания повторяющегося кода. |
| Автор: boostcoder 2.11.2010, 15:09 | ||
| тов. sofenru мне очень напоминает спам-бота и рекламщика и клоуна в одном лице. читаю тему, и не знаю, смеяться или плакать... Добавлено @ 15:09
куда Бьярне смотрел? |
| Автор: sofenru 2.11.2010, 15:26 | ||||||
искал - нету.... ну тогда дайте пример!
не люблю спам, но могу двигать сайты в инете даже не сумневайся... всё-таки, данный проект ближе к серьёзному... я действительно хочу написать либу и писать на ней проги... думаю, у меня это получиться... |
| Автор: azesmcar 2.11.2010, 15:29 | ||||
По первой же ссылке в google.
|
| Автор: sofenru 2.11.2010, 16:21 | ||
azesmcar, спасибо, но НАВЕРНОЕ (хотя тут с вами не в чём не уверен
|
| Автор: xvr 2.11.2010, 16:33 | ||
Предлагаю для творчества sofenru сделать отдельный раздел - что бы не нам одним было так весело |
| Автор: boostcoder 2.11.2010, 16:45 |
| sofenru, std::function и std::bind уже в стандарте, даже в микрософт компиляторе а вы просто не понимаете о чем говорите |
| Автор: sofenru 2.11.2010, 16:51 | ||||
ну да... мне нужны closure
скоро либа заработает и уже станет не совсем смешно... я предлагаю скромное компромиссное решение - ввести на винграде следующие топики: C/C++/С+++: Для новичков C/C++/С+++: Общие вопросы C/C++/С+++: Программирование под Unix/Linux ... и т.д |
| Автор: mes 2.11.2010, 16:56 | ||
слишком много букв.. лень читать билдероподобный код... вот Вам для разминки http://liveworkspace.org/code/287fc928cb9aa1596f4a88e24056794b
|
| Автор: boostcoder 2.11.2010, 16:59 |
точно сказано все будут плакать от того "как" она написана |
| Автор: mes 2.11.2010, 17:02 |
| Автор: sofenru 2.11.2010, 17:03 |
| mes, Выдаёт ошибку "function : is not a member of std" вот в этой строчке: std::function<void(btn*)> on_click; |
| Автор: mes 2.11.2010, 17:05 |
ну так может указать где выдает ? если на Вашем компиляторе, то полагаю что он у Вас староват для таких буст поможет.. |
| Автор: boostcoder 2.11.2010, 17:05 |
по приведенной ссылке, все работает. у вас наверное компилятор не "обычный" сейчас начнется срач |
| Автор: sofenru 2.11.2010, 17:07 |
| boostcoder, я согласен, что boost очень хорошая и продвинутая библиотека и хорошо, что её включили в визуал 10! Но я не готов её использовать в данный момент... Ну вот нужно сделать без неё, тем более здесь пишут, что это очень просто... ) Добавлено через 1 минуту и 21 секунду mes, у меня стоит Microsoft Visual 2008 ... ставить 2010 или boost? |
| Автор: boostcoder 2.11.2010, 17:10 |
это было бы действительно хорошо, будь это правдой |
| Автор: sofenru 2.11.2010, 17:14 | ||||
вроде читал когда-то, что хотели включить... |
| Автор: mes 2.11.2010, 17:22 | ||
| sofenru, вот велосипедно, для сравнения, в том стиле, что просили : http://liveworkspace.org/code/d9f8501d03202363ce817d2869b7dece П.С. грязь из за спешки Добавлено через 6 минут и 22 секунды
хм.. смотря что хотите ну а в принципе, если хотите не тратиться на велосипеды и быстрей выпустить свою либу Добавлено через 13 минут и 17 секунд вспомнил, есть еще мальнькая библиотечка (поиск по словам winnie closure) может помочь решить мелкие вопросики и возможно утолить любопытство.. |
| Автор: Alexeis 2.11.2010, 17:46 |
У меня boost нормально работает с Microsoft Visual 2005. Так что не нужно ни каких особых версий. Кстати выше речь шла о том что function<> добавили в STL. В 2010 студии и нет необходимости для этого подключать буст. |
| Автор: boostcoder 2.11.2010, 17:50 | ||
какой-то двойственный смысл... |
| Автор: Alexeis 2.11.2010, 17:56 |
| <functional> это же библиотека STL . Раз они добавили в нее std::function<>, то нет необходимости использовать boost::function<> . |
| Автор: boostcoder 2.11.2010, 18:02 | ||
понял. в предыдущем посте, запятая сбивала с толку. |
| Автор: azesmcar 2.11.2010, 19:19 | ||||
что значит не то, это указатель на member функцию, а что ты под этим подразумевал я не знаю но ты забыл очень важную вещь. Эта функция не просто функция, это функция - член класса и вызывается она не просто так а для конкретного объекта. Для какого объекта она должна вызываться? sofenru не изобретай велосипеды, здесь уже чуть ли не все посетители раздела тебе сказали, что ты ерундой занимаешься. Займись чем нибудь полезным. Я думаю на данном этапе для тебя самым полезным будет более детальное изучение языка. Почитай лучше несколько умных книг вместо копирования классов из Дельфи. включить его (кстати далеко не весь) хотели в новый стандарт и включили кстати, просто стандарт пока не вышел и компиляторы его поддерживают частично. В VS2010 кое-что есть, но gcc 4.5.1 на порядок опережает по части экспериментальной поддержки нового стандарта.
не мелочись, чего уж там..а тебя давай сразу в администраторы. Как раз тут у нас представитель администрации, на месте и коронуют. |
| Автор: sofenru 3.11.2010, 18:48 | ||||||
Ага спасибо... сделал на ней... причём автор утверждает, что его способ это "что-то типа boost::function, но без использования динамической памяти" ... то есть, как я понимаю, даже намного круче!!! а вот, что он пишет про boost::functional
уже выложил версию 0.3 - можно выводить простейшие окошки... скоро уже буду элементики накидывать ) |
| Автор: boostcoder 3.11.2010, 19:00 | ||||
ну что тут скажешь... аффтар явно недорос до буста(как и ты) на самом деле, таким людям, не нужно ничего объяснять. такие тоже нужны...все знают для чего уже страшно ты случаем свою ОСь и аналог фотошопа не писал раньше? кого-то ты очень напоминаешь Добавлено через 6 минут и 32 секунды
кстати. я полагаю, ты не тупое стадное быдла ищущее смысл в быдловизоре, и посему к тебе вопрос: из слов "того" аффтара о boost::function, ты понял, что это не хорошо, и сформировал для сепя позицию. так вот, пожалуйста, объясни, чем плохо динамическое выделение памяти, и почему(как) происходит фрагментация кучи? а так же, приведи доказательство того, что boost::function выделяет динамическую память. спасибо. |
| Автор: mes 3.11.2010, 21:55 | ||||
ну да а велосипед круче автомибиля, так как нет двигателя .. Я понимаю, конечно, экономия, экология.. но педали терь крутить вручную вножную.. Добавлено через 7 минут и 10 секунд напомнило один детский рассказ :
вобщем выбирайте кому должно быть больно: Вам, или компилятору с осью.. |
| Автор: boostcoder 3.11.2010, 22:25 | ||
мне это напомнило поговорку, которой я(будучи скептиком и циником) руководствуюсь:
это по поводу того, что кто-то что-то сказал, и где-то что-то написано. |
| Автор: Alexeis 3.11.2010, 22:37 | ||
Для чего там динамическая память? Это же шаблоны. Тут все известно на этапе компиляции. И число параметров и их тип. Такие вещи в С++ реализуются без кучи. |
| Автор: sofenru 4.11.2010, 10:57 |
| Зачем все эти бесконечные споры? Я признаю, что я слабовато знаю С++. Просто у меня такая специфика работы, то плюсы, то ява, то пхп (и весь это набор хтмл, цсс, яваскрипт и т.д. и т.п...), то асутп (тут свой набор языков) и т.д... Это всё невозможно знать досканально!!! Что-то лучше, что-то хуже, но, конечно, далеко до профи. Хотя и этого, в принципе, хватает.... Теперь я решил сосредоточиться только на С++ (ну ещё посматриваю в сторону явы, но пока только С++). Я совсем слабовато знаю STL и совсем не знаю BOOST. Так что кидайте сюда ссылки по этим либам для чайникофф На счёт своей библиотеки c3plus. Конечно же буду продолжать этот проектик! Думаю к новому году выйдет релиз!!! |
| Автор: mes 4.11.2010, 11:04 |
к function можно подключить любой бинд в рантайме, а значит хранит содержимое по указателю, т.е.в дин. памяти.. |
| Автор: Alexeis 4.11.2010, 11:43 |
Хотя да, приемник то универсальный. С другой стороны это никак не влияет на скорость запуска обработчика (invoke), а ведь это и есть самый главный параметр. Вот кстати результаты тестов http://www.codeproject.com/KB/cpp/fastdelegate2.aspx . В большинстве случаев назначение обработчика не является действием критичным по времени. |
| Автор: rudvil 5.11.2010, 00:41 | ||
| оффтопик, извиняйте - не удержался... object.cpp:383
|
| Автор: boostcoder 5.11.2010, 00:45 | ||
вопрос то в чем? код откуда? |
| Автор: mes 5.11.2010, 00:47 |
| boostcoder, 1111е сообщение |
| Автор: rudvil 5.11.2010, 00:47 | ||||
из этой библиотеки версии 0.3 =] в файле object.cpp:383 магические цифры, магическая переменная "a" |
| Автор: mes 5.11.2010, 00:57 |
для тс : http://cplusplus.com/reference/stl/list/ |
| Автор: boostcoder 5.11.2010, 00:57 |
уря! наверное ТС со мной не согласится(что скорее всего), ибо не понимает что пишешь просто кал Добавлено @ 00:58 он напишет лучше. |
| Автор: Sahab 5.11.2010, 01:28 |
| зря вы так без него скучнее)) |
| Автор: Alexeis 5.11.2010, 10:17 |
Ну прям вы придираетесь. Может это место для установки брейка. Я сам такое часто делаю. Может он тесты производительности делал на больших списках. Типа сколько времени займет поиск элемента. Пускай пишет. Зато больше узнает как это все устроено изнутри. На самом деле код системных библиотек С++ просто отвратительный для чтения/изучения. Безусловно авторы стремились добиться максимум производительности и экономии памяти, но такой код не годиться для изучения как пример того "как нужно правильно писать код". |