![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
drug007 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 3.11.2011 Репутация: нет Всего: 1 |
Добрый день.
Может кто-нибудь прояснить отношения между делегатами и замыканиями? Вроде по отдельности понятно, но вместе не укладываются. В моем понимании делегат это "жирный" указатель, т.е. два указателя вместе - один на функцию, а второй на ее контекст. А замыкание это когда происходит во вложенной функции захват внешней переменной путем того, что компилятор автоматически выделяет под эту переменную память в куче и туда ее копирует. И отсюда у меня получается, что делегат == замыканию, а это не так. Буду благодарен, если кто просветит... updated: поиск пролил немного света - вроде как делегат это указатель на функцию-член класса, а замыкание, это то, что я привел выше. т.е. делегат это частный случай замыкания? Это сообщение отредактировал(а) drug007 - 3.10.2014, 09:40 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
||||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
В Qt делегат это одно, в C# это другое, у Вас это что-то третее, непонятное мне.
Полагаю, аналогично и с замыканием. Я знаю что такое замыкание в теории множеств, а что оно значит у Вас? |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
ну давайте с терминологией разберемся.
делегатом в C# называется тип функции, используемый для передачи в качестве аргумента. анонимные функции могут использоваться везде, где ожидается делегат. в просторечии делегатом часто называется не тип, а сама функция, передаваемая в качестве аргумента. замыканием называется функция, ссылающаяся на контекст за своими пределами (на переменные, объявленные вне функции и не являющиеся параметрами). доступ к глобальным переменным (если они поддерживаются ЯП) есть у любой функции, поэтому замыкания имеют смысл когда функция определяется локально. В C# это анонимные функции. функции, принимающей делегата в качестве параметра, неважно, является ли делегат замыканием, т.к. он работает как черный ящик. |
|||
|
||||
drug007 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 196 Регистрация: 3.11.2011 Репутация: нет Всего: 1 |
Вроде теперь понятно. Получается, что делегат это просто функция, передаваемая как аргумент. А замыкание это более специализированный вариант делегата, потому что не только передается как аргумент, но и осуществляет захват внешнего контекста?
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
ага
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Понятно для C# и Java. Но здесь ведь раздел C++. Что для этого есть в C++?
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |