146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782

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

10.04.2009, 17:55. Показов 86734. Ответов 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
28.07.2022, 21:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от TRam_ Посмотреть сообщение
Вы сделали танчик и он должен существовать отдельно это же сразу очевидно
А вот сколькими связями его "отдельность" к прочим "отдельностям" - вопрос не очевидный и не тривиальный.
Например, считаем танчику физику - вначале для левой гусеницы, потом для правой.
То что вы описываете это проблема моделирования, а ещё конкретнее это проблема ооп. Обычно никто так не делает как вы написали, там просто 3д модель у которой запускается анимация при движении. Анимация правой гусеницы анимация левой и анимация разрушения. А потом у вас игра 30 гигабайт весит. Потому что таких танков пол сотни и не всегда гусеницы от одного подходят к другому.
Как сделать физику танка это вопрос математического моделирования а потом вы на это дело просто накладываете анимашку. И еще никому не удалось сделать без косяков. То дуло в стену влезет то дерево в башню падает насквозь то ещё какая нибудь хрень.
0
0 / 0 / 0
Регистрация: 14.06.2021
Сообщений: 17
26.03.2023, 16:08
тоже задумался над этим .. ну что то на подобии в яве это интерфейсы, ну и абстрактные методы, которые надо реализовывать.. мне ,сколько я ни писал прог на яве, только приходилось применять интерфейсы, а вот абстракции не писал.

Используется чаще тогда, когда подключаешься к чужому коду, работающему независимо.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.03.2023, 18:35
Mitya37, интерфейс это открытые функции и данные. Они статически связаны с объектом, объявляющим интерфейс. Наследование и виртуальные методы ослабляют зависимость, но в пределах ограниченных наследованием. Обратные вызовы, ослабляют зависимость на уровне передачи адреса запускаемой функции в явном виде. Древний си-шный способ. Функция объявляющая указатель на функцию параметром, обязуется выполнить передаваемую функцию, передав её параметры (если таковые тоже передаются и нужны), а так же может куда-то вернуть результат (если предусмотрено). Внешний вызывающий код передаёт функцию и параметры, ожидая результат. То есть зависимость минимальна. Экстремальный вариант - для спартанцев (и достаточно частый) - передача void(*)() . Легко передать что угодно и ни чего не проверяется. При наследовании есть хоть какая-то проверка типов. Зато свобода полная. В плюсах есть понятие вызываемого объекта. Существуют std::bind, std::function и лямбды. Можно самодельные функциональные объекты писать. Делай что хочешь и идёт оно лесом. Как в римском военном статуте, но... с колбэком.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.03.2023, 21:26
Святогор, вот наглядный пример: допустим, у нас есть одна-единственная структура с пятью полями. Получаем десять компараторов (коллбэков), чтобы иметь возможность сравнить сотрудников по любому из полей по возрастанию и по убыванию. Но при этом функция сортировки у нас всегда одна и та же - это библиотечная std::sort(). Нам не нужно лезть в её внутренности, чтобы что-то дописать/переписать как только у нас появился новый класс, или у старого класса появились новые поля.
Тысячи программистов по всему миру используют библиотечные функции, навроде std::sort(), полагаясь на контракт, который определяет внешний API таких функций1. Никто из них не меняет реализацию библиотечной функции - для большниства программистов это абстракция, чёрный ящик. Им абсолютно не важно, как она работает внутри. Но каждый из этих тысяч программистов может написать свой собственный компаратор для своего собственного класса:
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
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
 
struct Employee {
    int age;
    int salary;
    std::string firstName;
    std::string lastName;
    std::string phone;
 
    friend std::ostream &operator<<(std::ostream &output, Employee const &emp) {
        output << emp.firstName << ' ' << emp.lastName
               << " (" << emp.age << "): " << emp.phone
               << " [$" << emp.salary << "].";
        return output;
    }
};
 
namespace cyberforum::sourcerer::utilities {
template <typename Container>
void print(Container const &container, std::string const &message) {
    std::cout << message;
    for (auto const &elem : container) {
        std::cout << elem << '\n';
    }
    std::cout << '\n';
}
} // namespace
 
int main()
{
    std::vector<Employee> staff {
        {20, 50000, "Igor", "Sokolov", "8908-234-34-34"},
        {34, 45000, "Oleg", "Knyazev", "8905-456-56-56"},
        {30, 48000, "Lada", "Volkova", "8906-123-23-23"},
        {29, 60000, "Vlad", "Petelin", "8908-808-08-08"},
        {42, 35000, "Stas", "Vronsky", "8907-227-07-27"},
        {31, 55000, "Vera", "Gromova", "8909-449-39-59"},
        {33, 37000, "Gleb", "Koshkin", "8904-444-54-64"},
        {23, 42000, "Seva", "Boyanov", "8909-129-39-49"},
        {43, 32000, "Dara", "Kamneva", "8907-567-77-77"},
    };
 
    using Emp = Employee const &;
    namespace rng = std::ranges;
    namespace utl = cyberforum::sourcerer::utilities;
 
    // 1
    auto byAgeInAscendingOrder = [](Emp a, Emp b) {return a.age < b.age; };
    rng::sort(staff, byAgeInAscendingOrder);
    utl::print(staff, "Sorted by age in ascending order:\n");
 
    // 2
    auto byAgeInDescendingOrder = [](Emp a, Emp b) {return a.age > b.age; };
    rng::sort(staff, byAgeInDescendingOrder);
    utl::print(staff, "Sorted by age in descending order:\n");
 
    // 3
    auto bySalaryInAscendingOrder = [](Emp a, Emp b) {return a.salary < b.salary; };
    rng::sort(staff, bySalaryInAscendingOrder);
    utl::print(staff, "Sorted by salary in ascending order:\n");
 
    // 4
    auto bySalaryInDescendingOrder = [](Emp a, Emp b) {return a.salary > b.salary; };
    rng::sort(staff, bySalaryInDescendingOrder);
    utl::print(staff, "Sorted by salary in descending order:\n");
 
    // 5
    auto byFirstNameInAscendingOrder = [](Emp a, Emp b) {return a.firstName < b.firstName; };
    rng::sort(staff, byFirstNameInAscendingOrder);
    utl::print(staff, "Sorted by first name in ascending order:\n");
 
    // 6
    auto byFirstNameInDescendingOrder = [](Emp a, Emp b) {return a.firstName > b.firstName; };
    rng::sort(staff, byFirstNameInDescendingOrder);
    utl::print(staff, "Sorted by first name in descending order:\n");
 
    // 7
    auto byLastNameInAscendingOrder = [](Emp a, Emp b) {return a.lastName < b.lastName; };
    rng::sort(staff, byLastNameInAscendingOrder);
    utl::print(staff, "Sorted by last name in ascending order:\n");
 
    // 8
    auto byLastNameInDescendingOrder = [](Emp a, Emp b) {return a.lastName > b.lastName; };
    rng::sort(staff, byLastNameInDescendingOrder);
    utl::print(staff, "Sorted by last name in descending order:\n");
 
    // 9
    auto byPhoneInAscendingOrder = [](Emp a, Emp b) {return a.phone < b.phone; };
    rng::sort(staff, byPhoneInAscendingOrder);
    utl::print(staff, "Sorted by phone in ascending order:\n");
 
    // 10
    auto byPhoneInDescendingOrder = [](Emp a, Emp b) {return a.phone > b.phone; };
    rng::sort(staff, byPhoneInDescendingOrder);
    utl::print(staff, "Sorted by phone in descending order:\n");
}
Несложно себе представить какую-нибудь игру, типа Diablo III или, скажем, World of Warcraft, в которых сотни (если не тысячи) классов с десятками полей. Что же нам делать? Будем создавать под каждый случай новую специализированную функцию sort()? Нет, конечно. Просто в функцию сортировки в качестве callback'a третьим параметром передаётся компаратор (любой функциональный объект - lambda-выражение, функтор, переопределённый оператор вызова).

_______________________________
1Ровно то же самое мы делаем и в реальной жизни - мало кто (за исключением, скажем, угонщиков) замыкает провода, чтобы завести машину - мы пользуемся внешним API (ключи зажигания), полагаясь на контракт - "я поворачиваю ключ, машина заводится".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.03.2023, 21:26
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Гайд, как ворваться в вайб-кодинг в мае 2026
Noname2331 17.05.2026
Простите за получившееся полотно текста, я даже не знаю, как его разбить на главы. Тут, что называется, ни добавить ни убавить, одна сцена одним дублем. На моих глазах недавно случилось чудо. Как. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru