Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Делегаты и замыкания


Автор: drug007 3.10.2014, 08:16
Добрый день.
Может кто-нибудь прояснить отношения между делегатами и замыканиями? Вроде по отдельности понятно, но вместе не укладываются. В моем понимании делегат это "жирный" указатель, т.е. два указателя вместе - один на функцию, а второй на ее контекст. А замыкание это когда происходит во вложенной функции захват внешней переменной путем того, что компилятор автоматически выделяет под эту переменную память в куче и туда ее копирует. И отсюда у меня получается, что делегат == замыканию, а это не так. Буду благодарен, если кто просветит...

updated: поиск пролил немного света - вроде как делегат это указатель на функцию-член класса, а замыкание, это то, что я привел выше. т.е. делегат это частный случай замыкания?

Автор: baldina 4.10.2014, 23:41
Цитата(drug007 @  3.10.2014,  08:16 Найти цитируемый пост)
делегат это частный случай замыкания

замыкание частный случай делегата

Автор: math64 6.10.2014, 08:06
В Qt делегат это одно, в C# это другое, у Вас это что-то третее, непонятное мне.
Полагаю, аналогично и с замыканием. Я знаю что такое замыкание в теории множеств, а что оно значит у Вас?

Автор: baldina 6.10.2014, 11:09
ну давайте с терминологией разберемся.

http://msdn.microsoft.com/ru-ru/library/ms173171.aspx в C# называется тип функции, используемый для передачи в качестве аргумента. анонимные функции могут использоваться везде, где ожидается делегат.
в просторечии делегатом часто называется не тип, а сама функция, передаваемая в качестве аргумента.

https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5) называется функция, ссылающаяся на контекст за своими пределами (на переменные, объявленные вне функции и не являющиеся параметрами). доступ к глобальным переменным (если они поддерживаются ЯП) есть у любой функции, поэтому замыкания имеют смысл когда функция определяется локально. В C# это анонимные функции.

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

Автор: drug007 6.10.2014, 11:21
Вроде теперь понятно. Получается, что делегат это просто функция, передаваемая как аргумент.  А замыкание это более специализированный вариант делегата, потому что не только передается как аргумент, но и осуществляет захват внешнего контекста?

Автор: baldina 6.10.2014, 11:38
ага

Автор: math64 6.10.2014, 12:12
Понятно для C# и Java. Но здесь ведь раздел C++. Что для этого есть в C++?

Автор: xvr 6.10.2014, 12:22
Цитата(math64 @  6.10.2014,  12:12 Найти цитируемый пост)
Что для этого есть в C++?

В C++11 есть и то, и другое. std::function (делегат) и лямбда функции (замыкание).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)