Полный пример
Программа DelegateAccount иллюстрирует использование делегатов на примере банковского счета. В файле DelegateAccount.cpp объявляется делегат NotifyCallback. Методы, соответствующие по сигнатурам методам, описанным в объявлении делегата, реализованы в классе DelegateAccount. Метод Маin (Главный) создает экземпляры делегатов и объединяет их различными способами. Указатель на экземпляр делегата передается экземпляру класса Account (Счет), который использует инкапсулированные делегатом методы для выдачи соответствующего ситуации сообщения об овердрафте.
Обратим внимание на динамичную и гибкую связь между этими объектами. Класс Account (Счет) не знает, какой из методов будет использоваться для выдачи сообщения в случае овердрафта. Он просто вызывает делегат, который по очереди вызывает все методы из списка, причем адаптацию списка можно производить и в процессе выполнения программы.
Приведем исходный код класса Account (Счет): //Account.h _delegate void NotifyCallback(Decimal balance); // делегировать NotifyCallback (Десятичный баланс); _gc class Account // класс сборщика мусора Счет { private: // частный Decimal balance; // Десятичный баланс NotifyCallback *pNotifyDlg; public: Account(Decimal bal, NotifyCallback *pDlg) // Счет { balance = bal; // баланс pNotifyDlg = pDlg; } void SetDelegate(NotifyCallback *pDlg) { pNotifyDlg = pDlg; } void Deposit(Decimal amount) // Депозит (Десятичное количество) { balance = balance + amount; // баланс = баланс + количество; } void Withdraw(Decimal amount) // Десятичное количество { balance = balance – amount; // баланс = баланс – количество; if (balance < 0) // если (баланс <0) ситуация кредита //по текущему счету pNotifyDlg(balance); // баланс – обратный вызов } _property Decimal get_Balance() // Десятичное число } return balance; // баланс } _property void set_Balance(Decimal balance) // Десятичный // баланс { this › balance = balance; // баланс } };