Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Делегаты и замыкания 
:(
    Опции темы
drug007
Дата 3.10.2014, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



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

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

Это сообщение отредактировал(а) drug007 - 3.10.2014, 09:40
PM MAIL   Вверх
baldina
Дата 4.10.2014, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



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

замыкание частный случай делегата
PM MAIL   Вверх
math64
Дата 6.10.2014, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



В Qt делегат это одно, в C# это другое, у Вас это что-то третее, непонятное мне.
Полагаю, аналогично и с замыканием. Я знаю что такое замыкание в теории множеств, а что оно значит у Вас?
PM   Вверх
baldina
Дата 6.10.2014, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



ну давайте с терминологией разберемся.

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

замыканием называется функция, ссылающаяся на контекст за своими пределами (на переменные, объявленные вне функции и не являющиеся параметрами). доступ к глобальным переменным (если они поддерживаются ЯП) есть у любой функции, поэтому замыкания имеют смысл когда функция определяется локально. В C# это анонимные функции.

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

PM MAIL   Вверх
drug007
Дата 6.10.2014, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 3.11.2011

Репутация: нет
Всего: 1



Вроде теперь понятно. Получается, что делегат это просто функция, передаваемая как аргумент.  А замыкание это более специализированный вариант делегата, потому что не только передается как аргумент, но и осуществляет захват внешнего контекста?
PM MAIL   Вверх
baldina
Дата 6.10.2014, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



ага
PM MAIL   Вверх
math64
Дата 6.10.2014, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Понятно для C# и Java. Но здесь ведь раздел C++. Что для этого есть в C++?
PM   Вверх
xvr
Дата 6.10.2014, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0761 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.