Моделирование фондовой биржи Для дальнейшего знакомства с использованием делегатов рассмотрим пример моделирования фондовой биржи, реализованный в папке stockMarket. Модель состоит из двух модулей:
На рис. 5.2 показана общая архитектура модели.
Модель содержит следующие параметры:
Запуск моделирования Скомпонуйте и запустите программу StockMarket. Начните с принятой по умолчанию конфигурации: информация о текущем шаге не выводится, информация о сделках выводится, количество шагов— 100. (Заметим, что в программе используется генератор случайных чисел, так что результаты будут разными при каждом запуске программы.) Ticks are OFF
Список доступных команд выводится по команде help (помощь). Вот что выводится по этой команде: count set run count
При выполнении программы выводится информация о шаге, акциях, цене и количестве проданных акций. Определение делегата В файле Engine . h объявлены два делегата. _delegate void TickCallback(int ticks);
Как мы уже знаем, делегат подобен классу, так что экземпляр делегата создается с помощью оператора new (создать). TickCallback *pTickDlg =
Имя метода передается делегату в качестве аргумента его конструктора. Сигнатура метода должна совпадать с сигнатурой делегата. static void PrintTick(int ticks)
Передача информации о делегате эмулятору Класс Admin (Управляющий модуль) передает информацию об используемом делегате классу Engine (Машинный модуль) при вызове конструктора класса Engine (Машинный модуль). Engine *pEngine = new Engine(pTickDlg, pTradeDlg); Генерация случайных чисел Основой эмулятора является метод Run (Запуск) класса Engine (Машинный модуль). Основная работа метода Run (Запуск) состоит в присвоении данных, полученных в результате генерации случайных чисел. Для генерации случайных чисел используется класс System: :Random (Система::Случайный), рассмотренный нами в главе 3 "Программирование на управляемом C++". double г = pRangen->NextDouble();
Использование делегатов Указатели на экземпляры делегатов объявляются в классе Engine (Машинный модуль): TickCallback *pTickOp;
Указатели на делегаты инициализируются в конструкторе класса Engine (Машинный модуль): Engine(TickCallback *pTickOp, TradeCallback *pTradeOp)
Метод, связанный с экземпляром делегата, можно вызвать, используя указатель на делегат: pTickOp(tick);
|