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

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

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

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

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

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

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

103
17 / 18 / 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
9005 / 4706 / 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru