Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/449: Рейтинг темы: голосов - 449, средняя оценка - 4.76
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782

Для чего нужны callback-функции

10.04.2009, 17:55. Показов 86860. Ответов 103
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для чего нужны callback-функции? И можно привести какой-нибуль пример по их использованию.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2009, 17:55
Ответы с готовыми решениями:

Для чего нужны указатели на функции?
для чего нужны эти указатели на функции... не проще ли вызвать саму функцию, чем заводить под нее указатель и им пользоваться...

Для чего нужны виртуальные функции и виртуальное наследование ?
Для чего нужны виртуальные функции и виртуальное наследование ? Я нашел не сколько статей но не все понял. Заранее спасибо!

Для чего нужны функции void, не возращающие никаких значений?
собственно сабж. выводить текст можно и без функции. а для чего делать что-то, что в дальнейшем и не пригодится в программе? #include...

103
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
04.06.2020, 23:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Абсолютно во всех языках значения терминов как правило далеки от повседневного значения самих слов.
не со гла сен. Сотни раз приходилось вместо обьяснения просто найти перевод слова с латыни или английского и тогда становилось ясно что к чему. В совершенно разных областях это и психология и политика и много чего ещё. Про математиков это вообще отдельный разговор, там камеди клаб на 4 сезона можно снять как они дают названия в переводе.

Цитата Сообщение от DrOffset Посмотреть сообщение
Такое ощущение, что на приемке у комиссии, которая всеми силами пытается найти недостатки. Цели конструктивной работы, естественно, не преследуются.
А вот и нет. Я вам отвечаю что от объяснений я ничего не понял, более того с каждым новым объяснением сущности участвующие в нашем с вами спектакле умножаются минимум в двое. Мне по сути и уточняющий вопрос не получается задать я не вижу что тут вообще можно уточнять.

вот человек говорит:


Цитата Сообщение от DrOffset Посмотреть сообщение
В случае сортировки мы говорим:
"сортировка - сортируй по возрастанию. Вот тебе функция, которая сравнивает элементы таким образом, чтобы у тебя это получилось.
сразу возникает вопрос а нафига мне кому-то говорить "вот на тебе функцию и делай" когда у меня уже есть функция которая итак может все это сделать? Зачем мне её кому-то передавать?
И самое главное что человек отвечающий мне таким образом не думает что такой вопрос у вскяого обязательно возникает.


Цитата Сообщение от hoggy Посмотреть сообщение
функция copy периодически запускает коллбек,
в котором она сообщает, сколько процентов уже скопировалось.
ей все равно, как именно каллбек поступит с полученной информацией.
Вы меня извините но вы по факту из одного потока посылаете сообщение в другой поток. У вас минимум два кода выполняются паралельно и один другому периодически шлёт информацию о состояние копирования. Зачем здесь нужен термин callback мне не понятно.

Судя по англоязычной (как ни странно) википедии есть три вида колбэка......
Пример про копирование это похоже про колбэки в оконных операционных системах где есть куча специальных функций на события.
Пример про сортировку это блокирующий колбэк.
А в яваскрипте речь идёт об асинхронном.
и вообще здесь попахивает ещё и историей развития этого термина что он означал 60 лет назад и что и под каким впечатлением к нему прицепили 40 лет назад и ещё потом в жаваскрипте стало под этим называться.

Просто так передать кудато код функции это мне кажется ещё н е совсем колбэк.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
04.06.2020, 23:36
Цитата Сообщение от Святогор Посмотреть сообщение
сразу возникает вопрос а нафига мне кому-то говорить "вот на тебе функцию и делай" когда у меня уже есть функция которая итак может все это сделать?
Этот вопрос в общем-то вообще не относится к callback`ам. Это основа всего программирования в целом - декомпозиция, разделение задачи на составные части, на общее и частное. Такое разделение - это способ борьбы со сложностью.

Допустим у нас есть функция, которая "итак может все это сделать" (с), т.е. сортирует по возрастанию. Ну, прекрасно.
Затем нам нужна будет функция, которая сортирует по убыванию. Если операция сравнения элементов "вшита" в первую функцию, нам не останется ничего другого, кроме как сделать еще одну, точно такую же в целом функцию, которая сортирует уже по убыванию.
Это еще не все, допустим мы хотим отсортировать строки. Значит нам нужна будет точно такая же сортировка, но для сравнения строк? Придется сделать еще одну. И так далее. Получается: алгоритм один и тот же, а функций, реализующих этот алгоритм у нас очень много. Сложность проекта растет. Какая сложность? Их несколько, из них как минимум:
1) Количественная сложность - кода становится тупо больше, каждый тип сортировки занимает место;
2) Сложность сопровождения - если нам надо сменить алгоритм, то придется переписывать много функций, а не одну.
0
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
04.06.2020, 23:38
Следующий вопрос. Тут были примеры со всякими записками и я понял это так что вот мол кидай данные какие попало и какую попало функцию и о чудо оно как-то там само будет работать. По факту мы дложны дать правильные данные и правильную подходящую функцию, кто-то говорил что можно интегрировать что хочешь, но ведь все равно надо писать алгоритм для каждой математической функции чтобы её интегрировать. Зачем не тогда общий код в стиле "дайте мне кашу и дайте мне ложку я щас буду есть"
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.06.2020, 23:42
Цитата Сообщение от Святогор Посмотреть сообщение
У вас минимум два кода выполняются паралельно и один другому периодически шлёт информацию о состояние копирования. Зачем здесь нужен термин callback мне не понятно.
1.
это не принципиально на самом деле,
но с чего ты взял, что два кода выполняются параллельно?

2.
что означает "термин callback" - ты понял?

с точки зрения реализации, callback - просто функция,
или любой другой функциональный объект (функтор или лямбда),
который механизм будет дёргать по мере необходимости,
что бы получить какие то данные,
или что бы уведомить внешний мир о статусе своей работы.

и фсёёёё.

ничего сложного, как видишь.

Цитата Сообщение от Святогор Посмотреть сообщение
Зачем здесь нужен термин callback мне не понятно.
давай ещё раз рассмотрим функцию:
C++
1
copy(const path& from, const path& to, const callback& foo);
ты понял принцип работы этой функции?

функция выполняет копирование из from в to
и периодически запускает коллбек foo,
что бы сообщить сколько уже процентов было скопировано.

можешь сказать что означает 3й параметр функции?
1
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
04.06.2020, 23:42
Цитата Сообщение от DrOffset Посмотреть сообщение
Допустим у нас есть функция, которая "итак может все это сделать" (с), т.е. сортирует по возрастанию. Ну, прекрасно.
Затем нам нужна будет функция, которая сортирует по убыванию. Если операция сравнения элементов "вшита" в первую функцию, нам не останется ничего другого, кроме как сделать еще одну, точно такую же в целом функцию, которая сортирует уже по убыванию.
Это еще не все, допустим мы хотим отсортировать строки. Значит нам нужна будет точно такая же сортировка, но для сравнения строк? Придется сделать еще одну. И так далее. Получается: алгоритм один и тот же, а функций, реализующих этот алгоритм у нас очень много. Сложность проекта растет. Какая сложность? Их несколько, из них как минимум:
1) Количественная сложность - кода становится тупо больше, каждый тип сортировки занимает место;
2) Сложность сопровождения - если нам надо сменить алгоритм, то придется переписывать много функций, а не одну.
Вы извините но я нифига не понимаю как вы хотите написать 30 алгоритмов сравнения при этом из не написать? У вас все равно в коде будет куча функций сравнения для каждого типа данных своя, у вас общее только название " сравнение" ах да и ещё цикл фор для преборки массива данных.
какойже это один и тотже алгоритм сравнения если вы строки сравниваете одним способом числа другим способом а скалярные вектора третьим?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
04.06.2020, 23:50
Цитата Сообщение от Святогор Посмотреть сообщение
Просто так передать кудато код функции это мне кажется ещё н е совсем колбэк.
Неправильно вам кажется. Именно просто так передать куда-то функцию для выполнения - это и callback. Всякие детали, асинхронно или еще как ее будут выполнять, в этой среде, или в чужой, в этом процессе, если в чужом - это все несущественные детали, зависящие от конкретной уже задачи. К вопросу "зачем нужен callback" это все имеет весьма опосредованное отношение. Ответ на вопрос, зачем нужен callback, очень простой - он нужен, чтобы сообщить вызываемой стороне что надо делать.

Вопрос зачем нужно вообще делить стороны, чтобы нужно было что-то куда-то сообщать, к этой теме "зачем нужен callback" не имеет никакого отношения. Этот вопрос более фундаментальный и затрагивает, как я уже сказал, все программирование в целом. Можно сказать, что программирование - это искусство делить вещи на общее и частное и организовывать взаимодействие с\между ними. Callback - это просто способ организовать взаимодействие между общим и частным.

Добавлено через 5 минут
Цитата Сообщение от Святогор Посмотреть сообщение
Следующий вопрос. Тут были примеры со всякими записками и я понял это так что вот мол кидай данные какие попало и какую попало функцию и о чудо оно как-то там само будет работать. По факту мы дложны дать правильные данные и правильную подходящую функцию, кто-то говорил что можно интегрировать что хочешь, но ведь все равно надо писать алгоритм для каждой математической функции чтобы её интегрировать.
Странно. Т.е. по вашему, мама может написать на холодильнике записку "сына, докажи мне, пожалуйста теорему Ферма" и любой сына ее докажет? В реальной жизни точно также существуют определенные ограничения, которые нужно учитывать в этой записке. Эти ограничения в программировании называют контрактом и он, контракт, определяет что можно делать, а что нельзя. Например контракт для функтора в сортировке это: "принять два значения для сравнения, вернуть результат их сравнения в виде булева значения". Простор для свободы действий оставлен в том, каким именно образом можно это сравнение провести. В случае с сыной и записками, этот простор действий тоже ограничен хоть и гораздо шире, чем в примере сортировки.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
04.06.2020, 23:55
Цитата Сообщение от Святогор Посмотреть сообщение
не со гла сен. Сотни раз приходилось вместо обьяснения просто найти перевод слова с латыни или английского и тогда становилось ясно что к чему.
Точно так же как ровно такие же самые "сотни раз" по естественному значение русского термина сразу было ясно, что к чему. И точно так же как сколько не переводи со словарем англоязычные термины "ideal" (теория групп), "clique" (теория графов) или "lambda", никакого представления о значении этих терминов вы получить не сможете.

Так что нет, ни разу вам НЕ приходилось "вместо объяснения просто найти перевод слова с латыни или английского". Вы выдумываете.

Цитата Сообщение от Святогор Посмотреть сообщение
но ведь все равно надо писать алгоритм для каждой математической функции чтобы её интегрировать.
И? Речь идет о том, чтобы не писать пятьдесят раз алгоритм интегрирования. Сама функция и алгоритм интегрирования этой функции - это совершенно разные вещи и вы это прекрасно понимаете.

Зачем же вы нам тогда здесь рассказываете про то, что сами функции все равно придется описывать много раз? Как это вообще относится к рассматриваемому вопросу?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
04.06.2020, 23:58
Цитата Сообщение от Святогор Посмотреть сообщение
Вы извините но я нифига не понимаю как вы хотите написать 30 алгоритмов сравнения при этом из не написать?
Вот именно, что этот подход как раз предполагает, что 30 алгоритмов писать не надо. Надо будет написать только 30 вариантов сравнения. Это гораздо проще, чем в случае, когда само сравнение "вшито" в алгоритм.
Цитата Сообщение от Святогор Посмотреть сообщение
У вас все равно в коде будет куча функций сравнения для каждого типа данных своя, у вас общее только название " сравнение" ах да и ещё цикл фор для преборки массива данных.
какойже это один и тотже алгоритм сравнения если вы строки сравниваете одним способом числа другим способом а скалярные вектора третьим?
Алгоритм сортировки одинаковый, а функции сравнения элементов - разные.
Мы поделили на частное и общее. Частное - это сравнение - их надо 30 штук. А общее, это сама сортировка.
Вот qsort - это и демонстрирует. Алгоритм быстрой сортировки реализован один раз и находится в библиотеке - это общее. Частности "как именно сортировать" - передаются в качестве callback.
0
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
05.06.2020, 00:23
Цитата Сообщение от hoggy Посмотреть сообщение
1
copy(const path& from, const path& to, const callback& foo);
ты понял принцип работы этой функции?
Я это понял но вы почему то это обьясняете о верблюде начиная с митохондрий.

Из вашего пример становится понятно что ключевым обстоятельством является то что вы точно знаете что вызываемая функция во много раз медленнее чем та которая ей передана. То есть в вызываемой функции вы по какому-то таймеру или в определённые моменты выполняете колбэк функцию.
И эта колбэк функция даёт вам квант времени на выполнение всего остального кода чтобы другие вещи могли тоже поработать а не ждать когда функция закончит работу.

С тем же успехом давно можно было сделать в среде разработки какой-нибудь менеджер времени который тупо в процентах от всего цикла даёт определённое время для каждой функции.

Добавлено через 10 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И? Речь идет о том, чтобы не писать пятьдесят раз алгоритм интегрирования. Сама функция и алгоритм интегрирования этой функции - это совершенно разные вещи и вы это прекрасно понимаете.
Так вы и будете писать 50 алгоритмов интегрирования для каждого случая свой.
Что ещё за общий алгоритм интегрирования для всех функций ? Вы наверное забыли отправить салфетки с набросками со обеденного стола в нобелевский комитет?
Либо пример с интегрированием крайне неудачный либо что то тут не то. Речь идёт о приближённом вычислении?
Потому что я вам могу такую функцию на калякать что и сам алан тьюринг вам не помог бы.
С помощь какой магии вы собрались сделать универсальный алгоритм вычисляющий любые интегралы?

Добавлено через 6 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
очно так же как ровно такие же самые "сотни раз" по естественному значение русского термина сразу было ясно, что к чему. И точно так же как сколько не переводи со словарем англоязычные термины "ideal" (теория групп), "clique" (теория графов) или "lambda", никакого представления о значении этих терминов вы получить не сможете.
Так что нет, ни разу вам НЕ приходилось "вместо объяснения просто найти перевод слова с латыни или английского". Вы выдумываете.
Привожу пример. Помните евгения нашего с вами понимаете ли петросяна? Вот у него был номер про популизм он (петросян) видимо думал что этот термин означает лизать сами знаете что, цитата: " иди занимайся своим делом" и многие политики тоже его так употребляли, потом оказалость что popula это на латыни не задница а толпа. Такая же история с термином "утопия"
никто там не утопает это просто недостижимый идеал.
Это так на вскидку вам про то как в нашей языковой среде живут иностранные термины.

Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
А общее, это сама сортировка.
Зашибись. Как вам удалось алгоритм сортировки отделить от сортировки? Я честное слово даже не представляю , всё что можно отделить только цикл перебора от сравнения. Это одна строчка кода этот цикл. Что мы этим экономим?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
05.06.2020, 00:24
Цитата Сообщение от Святогор Посмотреть сообщение
в определённые моменты выполняете колбэк функцию
ты обратил внимание, что назвал коллбек коллбеком?

не нужно говорить "колбэк функция".
достаточно просто: "коллбек".
итак понятно, что это функция, или какой то функциональный объект.

Цитата Сообщение от Святогор Посмотреть сообщение
И эта колбэк функция даёт вам квант времени на выполнение всего остального кода чтобы
причем тут кванты времени?

если мне понадобятся кванты времени, я знаю где их взять.
коллбеки для этого не нужны.


функция copy использует коллбек только для того,
что бы уведомить внешний мир о статусе проделанной работы.
и всё.

вот как по твоему твоя программа сможет узнать сколько процентов уже было скопировано?
никак не узнает, если функция copy ей об этом не сообщит.
а как функция copy сможет сообщить такую информацию?
через коллбек.


Цитата Сообщение от Святогор Посмотреть сообщение
С тем же успехом давно можно было сделать в среде разработки какой-нибудь менеджер времени который тупо в процентах от всего цикла даёт определённое время для каждой функции.
сейчас ты начал нести какой то бред,
который вообще не имеет никакого отношения ни к callback,
ни к этой реальности вообще.
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
05.06.2020, 00:25
Цитата Сообщение от Святогор Посмотреть сообщение
Так вы и будете писать 50 алгоритмов интегрирования для каждого случая свой.
Что ещё за общий алгоритм интегрирования для всех функций ? Вы наверное забыли отправить салфетки с набросками со обеденного стола в нобелевский комитет?
Ну, скажем так, не для всех, а для большого числа их из определенной категории.
Познакомьтесь с алгоритмами численного интегрирования. Например с тем, который используется в программе по предмету "численные методы", для обучения студентов - методом Эйлера. Этот метод позволяет решать любые обыкновенные дифференциальные уравнения или их системы.

Общая реализация таких алгоритмов, в том числе и собственно алгоритм Эйлера, без привязки к конкретной функции существует, например в boost.odeint. По-моему вполне очевидно, что задать уравнение для интегрирования - это гораздо проще, чем вручную писать даже простой метод Эйлера для каждой конкретной функции.
0
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
05.06.2020, 00:30
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну, скажем так, не для всех, а для большого числа их из определенной категории.
Познакомьтесь с алгоритмами численного интегрирования. Например с тем, который используется в программе по предмету "численные методы", для обучения студентов - методом Эйлера. Этот метод позволяет решать любые обыкновенные дифференциальные уравнения или их системы.
Так это и есть приближённое интегрирование. Вычислительная математика. Разве нет?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
05.06.2020, 00:37
Цитата Сообщение от Святогор Посмотреть сообщение
Зашибись. Как вам удалось алгоритм сортировки отделить от сортировки? Я честное слово даже не представляю , всё что можно отделить только цикл перебора от сравнения. Это одна строчка кода этот цикл. Что мы этим экономим?
Ну так пузырьковой сортировкой мир не ограничивается

Добавлено через 5 минут
Цитата Сообщение от Святогор Посмотреть сообщение
Так это и есть приближённое интегрирование. Вычислительная математика. Разве нет?
Да. И что? Иллюстративная ценность примера не страдает от того, что это приближенное вычисление. Более того, интегрирование за пределами школы практически всегда приближенное. Для реальной задачи интегрирования важно, чтобы точность была выше значимой погрешности, а это во многих задачах достижимая величина.
В любом случае - это уход от темы. Алгоритмы численного интегрирования существуют? Да. Их можно вынести отдельно? Да. Примеры даны выше. В контексте темы все предельно корректно.
1
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
05.06.2020, 00:52
Цитата Сообщение от hoggy Посмотреть сообщение
сейчас ты начал нести какой то бред,
который вообще не имеет никакого отношения ни к callback,
ни к этой реальности вообще
По слову бред чувствуется разрыв шаблона. А разве вам никогда не приходила идея того что вычислительные ресурсы программы можно точно контролировать?
Почему программист всегда имеет дело с некой пугающей неизвестностью? Почему память можно попросить гарантированной величины а циклы процессора нелзя ни просить ни квотировать для разных кусков кода?

Но вообще должен сказать что приведённый вами пример мне понравился. Именно в этом случае как ни странно термин callback имеет очень понятный и близкий к значению слова смысл. Верю. Спасибо вы мне действительно помогли. :-)

Остаётся неясным вопрос а каким образом в этот же термин обратного вызова вошли другие вещи которые как-то не похожи ни на какой вызов тем более на обратный.

Добавлено через 11 минут
Цитата Сообщение от hoggy Посмотреть сообщение
copy(const path& from, const path& to, const callback& foo);
ты понял принцип работы этой функции?
функция выполняет копирование из from в to
и периодически запускает коллбек foo,
что бы сообщить сколько уже процентов было скопировано.
можешь сказать что означает 3й параметр функции?
на сколько я понял третий параметр это функция const по моему не даёт её менять а & я не понял для чего , здесь это и не взятие адреса и не ссылка. Или пробела не хватет ? :-)

Добавлено через 3 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
а. И что? Иллюстративная ценность примера не страдает от того, что это приближенное вычисление. Более того, интегрирование за пределами школы практически всегда приближенное. Для реальной задачи интегрирования важно, чтобы точность была выше значимой погрешности, а это во многих задачах достижимая величина.
В любом случае - это уход от темы. Алгоритмы численного интегрирования существуют? Да. Их можно вынести отдельно? Да. Примеры даны выше. В контексте темы все предельно корректно.
Согласен.

Я кажется начинаю понимать к чему это но придумать полезное применение этому способу пока не могу.
0
05.06.2020, 00:59

Не по теме:

TheCalligrapher, hoggy, DrOffset, зачем вы кормите этого вампира? Видно же, что это не обычный новичок. Он выбирает из ваших аргументов нужное, компонует как ему выгодно, и делает очередной вброс, чтобы вас развести на дальнешее "объяснение". Нормальный человек читает весь текст целиком и задает вопрос в контексте прочитанного. А такой вот энерговампир, фигурно цитирует то, что поможет ему вытащить из вас еще больше энергии. Смотрите, вот он пишет для примера сортировки:

Цитата Сообщение от Святогор Посмотреть сообщение
Это одна строчка кода этот цикл.
А для примера копирования (который гораздо проще, чем любая сортирока) он этого не пишет. Зато пишет вот что:
Цитата Сообщение от Святогор Посмотреть сообщение
Но вообще должен сказать что приведённый вами пример мне понравился.
Не видно разве? Ну не может человек, который реально не понимает что такое принцип "разделяй и властвуй" ругать аргумент с сортировками за то, что "что там выносить-то - один цикл всего" и одновременно хвалить пример с копированием, в котором тот же самый цикл.

Миниатюры
Для чего нужны callback-функции  
0
05.06.2020, 04:38

Не по теме:

Цитата Сообщение от Святогор Посмотреть сообщение
Что ещё за общий алгоритм интегрирования для всех функций ? Вы наверное забыли отправить салфетки с набросками со обеденного стола в нобелевский комитет?
Либо пример с интегрированием крайне неудачный либо что то тут не то. Речь идёт о приближённом вычислении?
Кода вам привели пример с интегрированием, еще в самом начале этой темы, вам достаточно ясно объяснили о каком именно интегрировании идет речь. Какое слово в этом объяснении вам не понятно? Или вы уже успели забыть? Или, может быть, вы вообще не читали?

0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.06.2020, 09:36
Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
but.onClick =
Скорее в духе:
C++
1
but.setClikedCallback([](){ std::cout << "click!\n"; };);
Но по сути пример с шаблонами для gui не особо реалистичный.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.06.2020, 11:14
Объекты графического интерфейса - сложные монстры. Они совмещают функционал контроллов (субъектов действия и общения в разных потоках) и другие вещи, такие как окна, рамки, шрифты, способность хостить вложенные контроллы и себе подобные гуи. С этими гуями без наследования (множественного, причём) нельзя решить красиво. Хотя ни один дикий Сишник не признает этого.
Колбэк имеет право на жизнь именно для таких вещей как обобщённые алгоритмы, где специализация возможна на крошечном и универсальном (по виду и применению) кусочке кода. . Сортировка, хороший пример.
Ещё могут быть случаи с ООП когда нужно принимать объекты одного или разных типов и запускать член известной сигнатуры (тот или иной в зависимости от того как прибиндят на вызывающей стороне). Насколько я помню в ряде паттернов, это пока наиболее простой вариант.
А по сортировке - наш "клиент/эксперт" не видел ни чего круче пузырька, хотя и пузырёк переписывать - не фонтан. Потом при изменении каой-то фишки придётся по всем пузырькам пробежать...
А второй случай - язык, который не предоставляет других механизмов. Си и операционные системы на нём написанные - царство коллбеков.
Сейчас с function<> и лямбда расширилась возможность передачи вызова и возможно данной техникой злоупотреблят где-то.
Но это же не простая тема.
Конструктор - кусок кода который выполняется при создании объекта
это не о чём. Так же можно сказать и о колбэке: Колбэк это кусок кода, который выполняется по запуску объекта инкапсулирующего указатель на функцию, который в ходе исполнения можно переустанавливать. Иногда под колбэком имеют ввиду сам объект. И объект может быть решен как полиморфный тоже. Но это лишь вступление.
0
18 / 19 / 4
Регистрация: 27.06.2016
Сообщений: 236
05.06.2020, 12:52
Почему то пропало цитирование. Как только открываю форму ответа оно больше не появляется при выделении текста.

По сути: Я не вампир.

Представьте себе так думают новички- много чего не замечают и не могут охватить вниманием все то что им говорят.

Я на данный момент вижу три смысла в понятии callbac:

1) Вызывая какую-то длительно работающую функцию вы даёте ей кусок кода который она будет иногда выполнять чтобы в программе происходило что то ещё кроме самой функции.
То есть мы тем самым разделяем время между разными функциями, они выполняются не последовательно а в каком-то смысле параллельно.

2) если вы програмите под winapi то там как я понял частенько всякие системные функции требуют дать им ссылочку на ваш код который она выполнит при каком-нибудь событии или вообще при всех событиях. Вы даёте ссылку на вашу функцию а винапа как только что то происходит вызывает эту вашу функцию и закидывает в неё ссылку на нехилый массив с кучей сообщений от системы. А вы должны в этой функции определиться как на что реагировать если вам оно нужно.


3) Если у вас имеется два множества совместимых алгоритмов. То есть один может пользоваться результатами вычисления другого. То вместо того чтобы писать для каждого сочетания алгоритмов отдельную функцию можно сделать так чтобы один алгоритм получал в качестве данных другой алгоритм.

Например есть 10 вариантов алгоритма сортировки (и не только пузырьковый и жадный, но и мой сортирующий за один проход LOL) и есть 10 вариантов сравнения разных типов данных,( сравнение чисел, сравнение строк и т.д)
чтобы не создавать 100 функций в которых каждый тип сортируется всеми возможными способами можно сделать одну функцию которая в качестве аргументов получает алгоритм сортировки и алгоритм сравнения и плюс к этому 10 функций сравнения и 10 функций сортировки.
И таким образом вместо 100 функций мы обойдемся 21 штукой. Экономия на лицо.

4) в языках типа java scrip есть возможность асинхронного программирования и там можно делать функции которые выполняются параллельно независимо друг от друга
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
05.06.2020, 12:56
Цитата Сообщение от IGPIGP Посмотреть сообщение
Колбэк это кусок кода, который выполняется по запуску объекта инкапсулирующего указатель на функцию, который в ходе исполнения можно переустанавливать.
fix:
Колбэк это кусок кода, который выполняется когда его вызывают. по запуску объекта инкапсулирующего указатель на функцию, который в ходе исполнения можно переустанавливать.

Цитата Сообщение от Святогор Посмотреть сообщение
Я на данный момент
Просто берешь, начинаешь писать свое первое окошко на WinAPI и сразу же узнаешь для чего нужен callback, т.е. понимаешь пункт 2 (хоть там и не совсем так).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.06.2020, 12:56

приведите пожалуйста реальный прмиер: для чего нужны дружественные функции?
приведите пожалуйста реальный прмиер: для чего нужны дружественные функции?

For_each и аргументы callback-функции; Как передать callback'у больше одного аргумента
Изучаю контейнеры и алгоритмы stl по Майерсу . С непривычки слегка охренел и запутался в них . В общем есть у меня простой вызов...

callback функции не для кнопок на экране, а для клавиш на клав. и мышке. Как?
Я так понимаю, что в WIN API все действия делаются асинхронно через callback функции. Но как инициировать действие для клавиш клавиатуры...

Для чего нужны интерфейсы?
Объясните на пальцах для чего нужны интерфейсы, как я понял они описывают методы и свойства, которые при наследовании классами должны были...

Для чего нужны указатели?
Кто может объяснить для чего нужны указатели и смысл их? в интернете одна муть и еще для чего нужно new delete


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru