Делегаты на C++ - Александр Шаргин

Бесплатно читаем книгу Делегаты на C++ - Александр Шаргин без сокращений! Чтобы читать полную версию, не нужна регистрация на сайте. Помните, что чтение доступно как на компьютере, так и на Андроиде, Айфоне и любом другом телефоне.
Делегаты на C++ - Александр Шаргин

Александр Шаргин - Делегаты на C++ о чем книга


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

Читать онлайн бесплатно Делегаты на C++, автор Александр Шаргин


Введение

Делегаты - это объектно-ориентированные указатели на функции, используемые для callback-вызовов в среде CLR фирмы Microsoft. Делегат можно связать со статической функцией или с нестатическим методом любого класса (единственное условие - совпадение сигнатуры метода с сигнатурой, указанной в описании делегата). Затем связанную с делегатом функцию или метод можно вызывать, используя стандартный синтаксис вызова функции в C++. Несколько делегатов можно связать в цепочку. Благодаря этому можно "одним махом" вызвать все связанные с ними callback-функции. Следующий пример демонстрирует применение делегатов в языке C#.

>using System;

>using System.IO;


>namespace CSharpDelegates {

> class App {

>  // Определяем делегат Callback,

>  // который принимает 1 параметр и ничего не возвращает.

>  public delegate void Callback(string str);


>  // Это метод класса App.

>  public void OutputToConsole(string str) {

>   Console.WriteLine(str);

>  }


>  // А это статический метод класса App.

>  public static void OutputToFile(string str) {

>   StreamWriter sw = new StreamWriter("output.txt", true);

>   sw.WriteLine(str);

>   sw.Close();

>  }


>  public static void Main(string[] args) {

>   App app = new App();


>   // Создаём делегат.

>   App.Callback callback = null;

>   if (callback != null) callback("1");


>   // Добавляем ссылку на OutputToFile.

>   // Вызываем её через делегата.

>   callback += new App.Callback(App.OutputToFile);

>   if (callback != null) callback("2");


>   // Добавляем ссылку на OutputToConsole.

>   // Вызывается вся цепочка:

>   // сначала OutputToFile, потом OutputToConsole.

>   callback += new App.Callback(app.OutputToConsole);

>   if (callback != null) callback("3");


>   // Убираем ссылку на OutputToFile.

>   // Вызывается только OutputToConsole.

>   callback -= new App.Callback(App.OutputToFile);

>   if (callback!= null) callback("4");


>   // Убираем оставшуюся ссылку на OutputToConsole.

>   callback -= new App.Callback(app.OutputToConsole);

>   if (callback != null) callback("5");

>  }

> }

>}


Делегаты в CLR удобны, типобезопасны и эффективны. Последнее время на форумах RSDN часто поднимается вопрос о том, можно ли реализовать делегаты с аналогичными свойствами, оставаясь в рамках "чистого" C++. Оказывается, это вполне возможно. В этой статье я покажу, как это сделать.

Частное решение

Для начала создадим делегат для callback-вызова функций и методов с простейшей сигнатурой void(void). Интерфейс этого делегата будет выглядеть так.

Вы автор?
Жалоба
Все материалы размещаются на сайте его пользователями.
Если Ваша книга была опубликована без Вашего ведома и/или без Вашего согласия, пожалуйста, напишите нам, и мы в срочном порядке примем меры.