Файл: Разработка программ с графическим интерфейсом на С++ (Особенности объектно-ориентированной парадигмы программирования).pdf
Добавлен: 04.04.2023
Просмотров: 242
Скачиваний: 4
В С++ (и во многих других объектно-ориентированных алгоритмических языках, например, в Объектном Паскале) вводится новый тип данных – класс. Переменная типа класс называется объектом. Иногда объект называют также экземпляром класса. Формально описание класса напоминает структуру, но класс, кроме полей (переменных), содержит методы, которые задают допустимые действия над полями класса. Общее название для полей и методов – элементы класса.
В листинге 1 дается простейшее описание класса на языке С++.
Листинг 1. Описание класса на языке C++
class имя_класса {
private:
описание личных элементов класса
public:
описание общих элементов класса
};
Под личными элементами класса (private) понимаются такие элементы, которые могут использоваться только методами своего класса. К общим элементам класса (public) доступ разрешен в любом месте программы. Существуют и другие способы доступа к элементам класса.
Поля класса описываются внутри класса как обычные переменные. Методы – это функции, которые можно применять к полям. Считается хорошим стилем программирования, что внутри класса методы задаются своими прототипами. Вне класса (ниже его описания) приводится полное описание метода. Очень короткие методы можно полностью описывать внутри класса.
Как правило, поля являются личными элементами класса, т. е. доступ к полям разрешен только внутри методов класса. Это положение можно рассматривать как простейшую формулировку принципа инкапсуляции.
Если внутри класса метод описан прототипом:
тип_результата имя_метода (список типов параметров),
то при полном описании вне класса метод имеет заголовок:
тип_результата имя_класса::имя_метода (список параметров),
т. е. в заголовке перед именем метода указывается имя класса (через знак ::).
Существуют особые методы класса: конструкторы и деструкторы. Назначение конструктора заключается в создании экземпляра класса и инициализации его полей. Имя конструктора совпадает с именем класса. Конструктор никогда не вызывается явно, его вызов осуществляется компилятором в момент создания экземпляра класса.
Деструктор вызывается для уничтожения экземпляра класса. Имя деструктора образуется как ~имя_класса. Деструктор может вызываться в программе явно или (что происходит обычно) его вызов обеспечивается компилятором в момент уничтожения экземпляра класса.
Наличие конструктора и деструктора для любого класса обязательно; при их отсутствии компилятор автоматически создает стандартные варианты конструктора и деструктора.
Экземпляры класса могут создаваться автоматически или динамически. Уничтожение автоматически созданных экземпляров классов происходит также автоматически при завершении выполнения блока функции, в котором они были определены. Определение (описание) автоматического экземпляра класса может встречаться в любом месте функции и имеет вид:
имя_класса имя_экземпляра(параметры конструктора);
Перед созданием динамического экземпляра класса (по аналогии с любыми динамическими переменными) необходимо объявить указатель на экземпляр:
имя_класса* указатель_на_экземпляр;
Динамический экземпляр класса создается с помощью оператора new, а уничтожается с помощью оператора delete:
указатель_на_экземпляр= new имя_класса (параметры конструктора);
delete указатель_на_экземпляр;
Метод класса (по аналогии с полем структуры) вызывается одним из следующих способов:
имя_экземпляра.имя_метода или имя_экземпляра->имя_метода
Инкапсуляция – такое объединение внутри класса полей и методов, при котором доступ к полю возможен только путем вызова соответствующего метода.
При идеальном выполнении принципа инкапсуляции поля класса могут быть только личными (private).
Ниже перечислены уровни инкапсуляции, т. е. уровни доступа к элементам класса:
- private (личный). Этот уровень накладывает самые жесткие ограничения на доступ к элементам класса. Именно эти элементы могут быть использованы только методами данного класса. Как правило, поля класса объявляются private.
- public (общий). Элементы класса данного уровня доступны из любой точки программы (самый «широкий» доступ).
- protected (защищенный). Элементы класса данного класса доступны методам данного класса и его наследников.
Наследование – это возможность определения для базового класса (предка) иерархии производных классов (наследников), в каждом из которых доступны элементы базового класса (их описание становится частью описания производного класса). Иначе говоря, наследование – механизм, посредством которого класс может наследовать элементы другого класса и добавлять к ним свои элементы.
Как правило, базовый класс является общим, производные – более специальными, конкретными. Естественно, у класса-наследника обычно больше полей и методов, чем у класса-предка, так как при наследовании обычно добавляются новые элементы.
Если имеется иерархия классов, то можно рассматривать защищенные (protected) элементы класса, которые доступны для методов своего класса и его наследников.
Наследование может быть единичным (наследник имеет одного предка) и множественным (количество предков больше 1). В Си++ допустимо множественное наследование.
Наследование может быть общим, личным и защищенным.
Видимость полей и функций базового класса из производного определяется секцией, в которой находится объявление компонента, и видом наследования (таблица 1):
Таблица 1. Видимость компонентов базового класса в производном
Вид наследования |
Объявление компонентов в базовом классе |
Видимость компонентов в производном классе |
private |
не доступны |
|
private |
protected |
private |
public |
private |
|
private |
не доступны |
|
protected |
protected |
protected |
public |
protected |
|
private |
не доступны |
|
public |
protected |
protected |
public |
public |
Как видно из таблицы 1, при общем наследовании общие и защищенные элементы класса-предка сохраняют свой уровень инкапсуляции и в классе-наследнике. При личном наследовании общие и защищенные элементы класса-предка становятся личными для класса-наследника. При защищенном наследовании защищенные элементы сохраняют свой уровень в классе-наследнике, а общие становятся защищенными. Независимо от вида наследования, личные элементы базового класса недоступны в производных классах. Таким образом, чтобы «достать» их из производного класса, надо использовать унаследованные общие и защищенные методы класса-предка.
Описание производного класса в общем виде:
class Имя_производного_класса:
Вид_наследования_1 Имя_базового_класса_1,
Вид_наследования_2 Имя_базового_класса_2,
...
Вид_наследования_n Имя_базового_класса_n,
{
Описание_добавляемых_элементов_производного_класса
};
Если Вид_наследования не указан, то по правилу умолчания принимается public.
Самая простая ситуация — это единичное общее наследование. Заголовок производного класса в этом случае имеет вид:
class имя_наследника: public имя предка; // можно без public
Современные способы построения интерфейсов
Создание удобного для пользователя интерфейса не требует сложной серии операций в современном мире. Существующие среды разработки упрощают процесс создания графического интерфейса с высокой функциональностью, вследствие чего они являются очень привлекательными для пользователей по всем направлениям.
Для языка программирования C++ как наиболее популярного средства разработки ПО на сегодняшний день имеются несколько способов построения интерфейсов клиентских приложений. Основными операционными системами, используемыми для этой цели, являются Microsoft Windows (MS Windows) и Linux. Главным средством разработки программ для ОС семейства Windows является интегрированная среда разработки (IDE) MS Visual Studio (VS) с основными языками C++ и C#. Точно так же, как и в случае с Windows, лицензия VS для коммерческих продуктов является платной.
Программисты имеют долгую историю разработки приложений с GUI под Windows с использованием языков C и C++. Первые опыты восходят к временам Windows 2.0, когда использовался 16-битный API Windows на основе C, и для отображения окна требовались десятки строк кода. С годами уровень абстракции становился все выше и лучше. В 1992 году Microsoft выпустила библиотеку классов Microsoft Foundation версии 1.0 в составе Workbench для программистов. В выпусках версий Microsoft Windows 3.X операционная система использовала библиотеку, называемую Win16, которая содержала все необходимые функции и объекты, используемые для создания приложений с графическим интерфейсом пользователя. Эта библиотека немного облегчила «общение» с операционной системой и создание довольно привлекательных приложений [1.].
Через некоторое время Microsoft выпустила Microsoft Windows 95, а затем Windows 98. Библиотека операционной системы также была обновлена до Win32.
Поскольку использование Win32 требовало хорошего уровня понимания и работы, Microsoft выпустила настроенную версию библиотеки Win32, чтобы ее было легче понять. Библиотека Microsoft Foundation Class (MFC) Library версии 1.0 представляла собой набор из порядка 60 классов, предназначенных для оборачивания оконных частей и элементов рисования 16-разрядного API Windows. Win32 была написана на C, и MFC создавалась написана для разработчиков на C / C++ [5.]. Чтобы сделать программирование под Windows доступным для всех, Microsoft создала Microsoft Visual Basic как настоящую среду графического программирования. Visual Basic использовала другой, более простой язык, называемый Basic, как основу. Первым следствием их этого было то, что Visual Basic по своей сути не «понимал» Win32. Чтобы позволить программистам Visual Basic использовать то, что было доступно в Win32, его программисты должны были импортировать необходимые функции. Это привело к тому, что программисты Visual C++ использовали одну библиотеку, а программисты Visual Basic – другую; это только одна из многих проблем [2.].
К 2002 году MFC Library версии 7.0 увеличилась до более чем 200 классов. Несмотря на то, что MFC являлась мощным средством, во многих местах она страдала от того, что является лишь тонким слоем по сравнению с Win32 API, а также для многих программистов трудной для эффективного использования. Прямой доступ к Win32 API был все еще необходим для разработки приложений Windows, особенно потому, что планка базовых функций, необходимых для приложений Windows, продолжала расти. Как следствие, разработка любого нетривиального приложения с графическим интерфейсом Windows отнимала много времени и усилий. В то же время с ростом Интернета, клиент-серверных приложений, требовательных баз данных, коммуникационного программного обеспечения и т.д. Microsoft решила создать новую библиотеку, которая будет понятна и будет использоваться многими различными языками.
Чтобы решить растущие проблемы в разработке приложений, в начале 2002 года Microsoft выпустила новую среду программирования для платформы Windows. Эта среда, известная как .NET Framework, предоставила управляемую среду выполнения для приложений, а также большой набор библиотек, известный как библиотека классов .NET Framework для разработчиков. .NET Framework управляет памятью и безопасностью, что делает приложения более надежными. Библиотека классов .NET Framework предоставляет обширную, богатую и унифицированную библиотеку классов, доступную одинаково для любого языка .NET, включая Managed Extensions для C++ – управляемой версии C++, которую Microsoft предоставляет программистам .NET. Часть .NET Framework, Windows Forms (WinForms), представляет собой набор классов для создания клиентских приложений Windows [1.,3.]. Альтернативой WinForms является Windows Presentation Foundation (WPF), ставшая популярной с появлением более современных версий ОС (таких как Windows 7 и Windows 8). Microsoft также разработала другие языки, такие как C#, J#, JScript, и другие среды программирования, которые использовали эти языки, также являющиеся частью семейства, совместно использующего библиотеку .NET Framework.
Наиболее подходящим вариантом для низкобюджетных проектов остается операционная система Linux. Кроме того, что большинство дистрибутивов этой ОС являются свободно распространяемыми, до сих пор имеется ряд бесплатных средств для разработки ПО для этой системы. Одним из наиболее распространенных средств для программирования на языках C, C++ и QML является кроссплатформенная свободная IDE под названием Qt Creator. Эта среда была разработана Trolltech (Digia) для работы с фреймворком Qt; первоначальное кодовое название – Greenhouse. Qt Creator включает в себя графический интерфейс отладчика и визуальные средства разработки интерфейса как с использованием виджетов QtWidgets (аналог WinForms), так и QML. Альтернативой WPF является Qt Quick. Qt Creator платный для закрытых проектов.