- Целые типы
- Вещественные типы (double, float)
- Комплексное число (complex)
- Тип string
- Структуры, классы и интерфейсы
- Объект динамического массива
- Матрицы и векторы
- Приведение типов
- Тип void и константа NULL
- Пользовательские типы
- Указатели объектов
- Ссылки. Модификатор & и ключевое слово this
Пользовательские типы
Ключевое слово typedef в языке C++ позволяет создавать пользовательские типы данных – для этого достаточно определить новое имя типа данных для уже существующего типа данных. При этом сам новый тип данных не создается, а лишь определяется новое имя для уже существующего типа. Благодаря использованию пользовательских типов можно делать программы более гибкими: для этого иногда достаточно изменить typedef-инструкции с помощью макросов подстановки (#define). Использование пользовательских типов позволяет также улучшить читабельность кода, поскольку для стандартных типов данных с помощью typedef можно использовать собственные описательные имена. Общий формат записи инструкции для создания пользовательского типа:
typedef тип новое_имя; |
Здесь элемент тип означает любой допустимый тип данных, а элемент новое_имя – новое имя для этого типа. Важно отметить, что новое имя определяется только в качестве дополнения к существующему имени типа, а не для его замены. В языке MQL5 с помощью typedef можно создавать указатели на функции.
Указатель на функцию
Указатель на функцию в общем виде определятся форматом записи
typedef тип_результата_функции (*Имя_типа_функции)(список_типов_входных параметров); |
где после слова typedef задается сигнатура функции – количество и тип входных параметров, а также тип возвращаемого функцией результата. В качестве объяснения приведем простой пример создания и использования указателя на функцию:
//--- объявим указатель на функцию, которая принимает два параметра типа int
|
В данном примере переменной func_ptr можно присвоить функции sub и add, поскольку они имеют по два входных параметра типа int, как это указано в определении указателя на функцию TFunc. А вот функция neg не может быть присвоена указателю func_ptr, так как ее сигнатура отличается.
Организации событийных моделей в пользовательском интерфейсе
С помощью указателей на функции удобно строить обработку событий при создании пользовательского интерфейса. Покажем на примере из раздела CButton, как можно создавать кнопки и добавлять в них функции для обработки нажатия. Сначала определим указатель на функцию TAction, которая будет вызываться по нажатию кнопки, и создадим три функции в соответствии с описанием TAction.
//--- создадим пользовательский тип функции
|
Затем произведем класс MyButton от CButton, в котором добавим член TAction, являющийся указателем на функцию.
//+------------------------------------------------------------------+
|
Далее создадим производный класс CControlsDialog от CAppDialog, в котором добавим массив m_buttons для хранения кнопок типа MyButton, а также методы AddButton(MyButton &button) и CreateButtons().
//+------------------------------------------------------------------+
|
Теперь мы можем написать программу с использованием панели управления CControlsDialog, в которой создается 3 кнопки "Open", "Save" и "Close". При нажатии на кнопку вызывается соответствующая ей функция, которая прописана в виде указателя на функцию TAction.
//--- объявим объект на глобальном уровне, чтобы создать его автоматически при запуске программы
|
Внешний вид запущенного приложения и результаты нажатия кнопок представлены на картинке.
Полный исходный код программы
//+------------------------------------------------------------------+
|
Смотри также