Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на языке высокого уровня Лекции 09.03.01

.pdf
Скачиваний:
30
Добавлен:
10.01.2021
Размер:
1.1 Mб
Скачать

Язык С++ допускает так называемое сложное наследование, то есть одновременное наследование от двух и более базовых классов.

class naslednik: public B1, public B2, protected B3 {........};

При этом в иерархии классов может оказаться так, что класс косвенно унаследует несколько представителей одного и того же базового класса (например, и B1 и B2 являются наследниками одного и того же класса А). Чтобы избежать такой ситуации при создании представителей класса-наследника применяют операцию разрешения видимости.

class A { protected: int mama;

int papa;

......}; void main() {

naslednik sinok; sinok.B1::mama=8; sinok.B2::papa=89;

........}

Тема 44. Виртуальные функции.

Среди особенностей объектно-ориентированного программирования особо выделяют полиморфизм - способность объектов различных классов отвечать на запрос той ли иной функции сообразно типу своего класса. Для обеспечения полиморфизма С++ предлагает механизм виртуальных функций.

Рассмотрим пример:

# include <iostream.h> class X

{ public:

double tryp (float x) {return 5*x;} double giena (float x) {return 2+A(x);}

};

class Y : public X { public:

double tryp (float x) {return 5*10*x;}

};

void main() { Y proval;

cout << proval.giena(2)<<endl;

}

В этой программе выражение proval.giena(2) приведет к вызову наследуемой функции X::giena, которая, в свою очередь, вызовет X::tryp, а не Y::tryp. Таким образом, полиморфной реакции класса

Программирование на языке высокого уровня 09.03.01

51

не наблюдается. Если же добавить ключевое слово virtual перед именем функции tryp как при описании класса X, так и при описании класса Y, то требуемый эффект будет достигнут, то есть при работе программы будет вызвана замещающая функция Y::tryp.

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

Виртуальная функция-элемент некоторого класса может быть объявлена чистой:

virtual тип имя(аргументы)=0;

Такие функции создаются в базовом классе затем, чтобы потом переопределяться в классах, производных от него. Класс, объявляющий одну или несколько чисто виртуальных функций, является абстрактным базовым классом. У такого класса нельзя создать представитель, а нужен он только в качестве базового для дальнейшего порождения классов, которые будут реализовывать его чисто виртуальные функции. Существует возможность объявлять ссылки или указатели на абстрактный класс.

Введение в С++ механизма абстрактных базовых классов позволяет делать более четкой организацию иерархии классов.

Тема 45. Статические элементы класса. Пространства имен.

Можно объявить элемент класса (как данные, так и функции) статическим. Статический элемент данных существует только один, вне зависимости от того сколько представителей класса создано в процессе работы программы. Обратиться к открытому статическому элементу класса можно через любой представитель класса при помощи операций прямого или косвенного доступа либо с помощью операции разрешения видимости с использованием имени класса. Помимо объявления в определении класса, статический элемент должен еще и определяться:

class giena {

public: static int i;

......

};

Программирование на языке высокого уровня 09.03.01

52

int giena::i=0;

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

Язык С++ позволяет разрешать конфликты между разными переменными с одинаковыми именами, которые происходят из-за участия в разработке проектов большого числа программистов. Речь идет именно о глобальных переменных, так как конфликты между локальными и глобальными переменными всегда разрешаются в пользу локальных.

Проект можно разбить на части, определив для этих частей различные пространства имен. Для определения пространства имен используется следующий синтаксис:

namespace ИМЯ { список переменных}.

Для явного обращения к такой переменной используется префикс с названием соответствующего пространства имен и операцией разрешения видимости. Допускается использование вложенных пространств имен:

namespace TTT { int t;

namespace TTT1 { int t;

}

}.

Пример обращения - TTT::TTT1::x=99;

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

Если элемент некоторого пространства имен объявляется при помощи ключевого слова using, то все ссылки на этот элемент (имя переменной, массива, функции и т.д.) без каких-либо приставок будут соотносится с пространством имен, указанным в объявлении.

namespace AAA {

int fun (int i) {return i;}

}

namespace BBB {

int fun (int i) {return i*i;}

}

void main(void) { using BBB::fun; int x=7,y;

Программирование на языке высокого уровня 09.03.01

53

y=fun(x);

printf("%d\n",y);

}

Вторая форма использования ключевого слова using имеет вид: using namespace ИМЯ_ПРОСТРАНСТВА_ИМЕН;

В этом случае указанное пространство имен будет приниматься по умолчанию (без указания префиксов), если не используются локальные переменные с совпадающими именами.

# include <stdio.h> namespace A1 {

int x=11; int y=111; int w=1111;

}

namespace A2 {

int x=22; int y=222; int z=2222;

}

void main(void) {

using namespace A1; using namespace A2; using A2::x;

int z=3333; printf("x=%d,y=%d,z=%d,w=%d",x,A1::y,::z,w); printf("\nz=%d\n",z);

}

Будет напечатано x=22,y=111,z=2222,w=1111 z=3333.

Несмотря на то, что в программе указаны сразу два пространства имен, ошибок компилятора не возникает. Но при попытке обратиться к переменной y не используя явных приставок, будет выдано сообщение об ошибке.

Использование пространств имен внутри функций допустимо синтаксически, но лишено смысла.

Программирование на языке высокого уровня 09.03.01

54

Раздел 7. Визуальное программирование с использованием языка С++. Лекции 35-37.

Темы 46-48. Визуальное программирование с использованием языка С++ в среде С++ Builder (Turbo C++ 2006).

C++ Builder включает в свой состав визуальную интегрированную среду разработки, которая позволяет создавать достаточно сложные программы, работающие под управлением операционной системы Windows, и при этом минимизировать объем текста, который приходится писать программисту. При этом существует возможность редактирования ресурсов, входящих в приложение, как в визуальном, так и в текстовом представлении, причем оба эти представления изменяются синхронно.

Основой приложений, создаваемых в среде C++ Builder, являются формы. Создание пользовательского интерфейса приложения заключается в добавлении в окно формы элементов - объектов C++ Builder, называемых компонентами, и в установке значений их свойств. Кроме этого пишется текст специальных программ - обработчиков событий, на которые тем или иным образом реагируют размещенные в форме компоненты.

Формы и модули, входящие в приложения, управляются файлами проекта. Файл проекта имеет расширение brp, а кроме него создается файл исходного текста проекта с таким же именем, но с расширением cpp. Как правило, изменения в этот файл вносятся автоматически.

При добавлении к проекту формы создаются файл ресурсов формы

срасширением dfm, содержащий информацию об интерфейсных элементах и других компонентах, принадлежащих форме, файл модуля

срасширением cpp, в котором, в частности, содержится текст обработчиков, а также файл с расширением h, в котором содержится описанием классов формы, а также пользовательских классов.

Для изменения свойств компонентов во время проектирования служит инспектор объектов. При помощи инспектора объекта можно

также сгенерировать прототип обработчика того или иного события и создать текст программы, описывающей действия, которые должны выполниться, если это событие произойдет.

При внесении в форму новых компонентов или генерации новых обработчиков событий соответствующие описания автоматически добавляются в h-файл. При удалении из формы компонентов их описания удаляются из h-файла, а описания обработчиков событий сохраняются. При переименовании компонентов изменяются их описания в h-файле, а также имена и описания обработчиков

Программирование на языке высокого уровня 09.03.01

55

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

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

#include.

Имя модуля внутри проекта должно быть уникальным, а если модуль связан с формой, то имя исходного файла модуля и файла формы должны быть одинаковыми.

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

Standart - стандартные компоненты для создания интерфейса (кнопки, списки, поля ввода и т.д.);

Additional - дополнительная группа стандартных компонентов (рисунки, геометрические фигуры и т.д.);

Win32 - интерфейсные элементы, характерные для Windows 95 (панели состояния, календарь, индикаторы выполнения и т.д.)

 

System

- компоненты, реализующие таймер, воспроизведения

 

файлов мультимедиа и т.д.;

Internet - компоненты для создания Web-приложений;

 

Data

Access - компоненты, позволяющие получить доступ к

 

объектам для работы с базами данных, то есть таблицами,

 

запросами и т.д.;

 

Data

Controls - компоненты, используемые для отображения

данных в виде таблицы, поля ввода и т.д.;

MIDAS - компоненты для создания распределенных систем;

Decision Cube - компоненты для построения многомерных таблиц и их графических отображений;

Qreport - компоненты для создания отчетов;

Программирование на языке высокого уровня 09.03.01

56

Dialogs - элементы для вызова диалоговых окон общего назначения, предоставляемых операционной системой Windows (открытие, сохранение, печать файлов и т.д.).

Укаждого компонента существуют свойства, которые определяют

его внешний вид и поведение. Часть свойств устанавливается по умолчанию. Для установки свойств компонентов или изменения их значений используются редакторы свойств, которые бывают следующих типов:

строка ввода - позволяет вводить новые значения для числовых и буквенных строк;

редактор с выпадающим списком значений - в колонке значений установлена стрелка вниз и это означает, что существует выпадающий список, откуда нужно выбирать значение;

диалоговая панель - в колонке значений установлена кнопка с

многоточием

и

это

означает,

что

установка

значения

производится путем выбора на панели;

 

 

 

набор вложенных свойств - в имени такого свойства установлен знак + и это означает, что можно раскрыть встроенный список подсвойств.

Для нескольких компонентов можно установить разделяемое

свойство. Для этого одновременно выбираются необходимые компоненты, причем в инспекторе объектов будут расположены только те свойства, которые присутствуют у всех этих объектов.

Размер компонента можно изменить, причем существует возможность сделать это в момент размещения компонента; компоненты можно копировать, группировать и выравнивать.

Помимо свойств с компонентами связаны методы - специальные функции. Так как компонент по своей сути это класс, а образ компонента на форме - представитель класса, то обратиться к такой функции-элементу можно используя знак указателя на объект. Например, Edit5->Show(). Методы не активируются во время проектирования. Список методов для данного компонента можно узнать, выбрав компонент на форме и нажав клавишу F1.

Компоненты могут тем или иным образом реагировать на происходящие события. Список событий, которые распознает той или иной компонент, можно узнать, просмотрев соответствующую вкладку инспектора объектов. Обработчик событий пишется программистом, и этот обработчик начинает работать тогда, когда происходит соответствующее событие.

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

Программирование на языке высокого уровня 09.03.01

57

будет сгенерирован. При этом компоненты, помещенные на форму в составе шаблона, остаются отдельными компонентами.

Компонент TMainMenu невидим и позволяет описать главное меню формы. Самым важным свойством этого компонента является свойство Items, при помощи которого задается список элементов меню, имеющих единственное событие OnClick, которое возникает при нажатии левой клавиши мышки над компонентом.

Компонент TPopupMenu позволяет создать контекстное меню для того или иного интерфейсного элемента. Он также имеет средство Items для задания списка элементов меню. У многих интерфейсных элементов форм имеется свойство PopupMenu, значением которого может быть имя компонента класса TPopupMenu. В этом случае при нажатии правой клавиши мыши при нахождении курсора над

соответствующим

интерфейсным

элементом

возникнет

заранее

заданное контекстное меню.

 

 

 

Компонент TLabel предназначен для отображения статического текста на форме. Отображаемая строка символов задается при помощи средства Caption. На возможность отображения текста в несколько строк влияет установка свойства Word Wrap, а на правила выравнивания текста - установка свойства Alignment. Для приспособления размера метки к фактическому размеру, занимаемому текстом, используется свойство AutSize.

Компонент TEdit отображает строку, в которой пользователь может редактировать текст. Строка символов, отображаемых этим компонентом доступна при помощи свойства Text. Существуют методы для выделения текста, его очистки, копирования в буфер и т.д.

Для работы с многострочными текстами используется компонент Tmemo. Его содержимым является массив строк, доступ к которому осуществляется при помощи свойства Lines, которое имеет два важных подсвойства - массив строк Strings и число строк, находящихся в поле ввода - Count.

Для включения в программу стандартных кнопок Windows используется компонент TButton, самым важным из событий которого является OnClick. Если программист хочет изменить цвет текста на

такой кнопке, то надо менять

настройки в операционной системе

или выбирать другие компоненты.

 

Управляющий элемент для

выбора одного из двух возможных

значений называется TCheckBox. Поясняющий текст для такого элемента задается в свойстве Caption, а для проверки, установлен ли флаг используется свойство Checked. Такую проверку обычно производят при наступлении события OnClick.

Для формирования группы, в которой можно выбрать только один элемент, используется компонент TRadioButton. Обычно для размещения такой группы используется один из компонентов-

Программирование на языке высокого уровня 09.03.01

58

контейнеров TGroupBox или TPanel. Их отличие в том, что первый из контейнеров только предлагает для группы компонентов общий заголовок, а второй позволяет произвести определенную настройку внешнего вида для набора компонентов. Так как из набора радиокнопок можно выбрать только одну, то каждая из радиокнопок, входящая в состав группы, "знает" о состоянии своих соседей. Для организации нескольких наборов переключателей используется компонент TRadioGroup.

Для организации стандартного выбора, то есть для выбора одного элемента из списка, используется компонент TListBox. Строковый массив элементов для выбора задается в свойстве Items, а номер выбранного элемента содержится в свойстве Itemindex, причем случаю, когда ни один элемент не выбран соответствует значение -1. Для редактирования содержимого списка используются стандартные методы - Add, Insert, Delete.

В случаях, когда пользователю помимо возможности выбора из списка предоставляется возможность ввода собственного значения, следует использовать компонент TComboBox. Для обеспечения пользовательского ввода наряду со свойством Items имеется и свойство Text.

Для прокручивания содержимого окна используется компонент TScrollBar. Для реакции на прокрутку используется событие OnScroll. Существует возможность установить, как будет передвигаться движок прокрутки при нажатии на линейку и на стрелки, расположенные в концах прокрутки.

Компонент TBitBin предназначен для создания кнопок с графическим изображением, у которых существует возможность изменения цвета надписи. Графическое изображение при помощи свойства Glyph может быть загружено из графического файла.

Для организации инструментальной панели используется компонент TSpeedButton. Кнопки на этой панели могут иметь и надпись, и графическое изображение. Существует возможность при помощи свойства GroupIndex объединить несколько кнопок в группу. При этом можно превратить такую группу кнопок в радиогруппу. Доступ к этим кнопкам может быть получен только при помощи мыши. При помощи свойства Flat можно добиться, чтобы кнопка всплывала при прохождении над ней мыши.

Компонент TMaskEdit предназначен для ввода пользовательской информации, но разрешает вводить только ту информацию, которая соответствует заранее заданному шаблону. Шаблон задается в редакторе свойства EditMask. Существуею стандартные шаблоны для ввода даты, времени, номера телефона и т.д.

Для работы с таблицей, элементами которой являются символьные строки используется компонент TStringGrid. Доступ к

Программирование на языке высокого уровня 09.03.01

59

ячейкам осуществляется при помощи свойства Cells и операции индексирования, причем на первом месте стоит номер столбца. Номер текущих строки и столбца хранится в свойствах Row и Col, а количество строк и столбцов таблицы определяется свойствами

RowCount и ColCount.

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

Для включения в форму произвольных графических изображений используется компонент TImage. С помощью свойства Picture вызывается редактор картинок, с помощью которого можно выбрать графический файл для загрузки. Размер компонента можно приспособить к размеру изображения с помощью свойства AutoSize.

Для рисования геометрических фигур используется свойство TShape. Тип фигуры задается в свойстве Shape, за прорисовку границы фигуры отвечает свойство Pen, а за заливку - свойство

Brush.

На панели Additional имеется еще один тип контейнера для группировки компонентов - компонент TBevel. В свойстве Share можно задавать тип фигуры, в форме которой задается рамка, а при помощи свойства Style задается стиль - выпуклый или вдавленный.

Иногда какой-либо объект, расположенный на форме, не

помещается в

отведенное ему

место. Существует возможность

включения в

форму области

TScrollBox, которая способна

осуществлять скроллинг содержащегося в ней объекта.

Для предоставления пользователю списка выбора, в котором можно отметить несколько значений, существует компонент TCheckListBox. Свойство Checked для этого компонента представляет собой массив значений, указывающих, выбран или нет каждый элемент списка.

Для размещения на форме статического текста в специальном окне используется компонент TStaticText. Существуют свойства для задания типа этого окна.

Для создания контейнера свойства ActivePage, число страниц - в свойстве PageCount. Номер страницы задается в свойстве

PageIndex.

Для выбора целых значений из определенного интервала используется компонент TUpDown. С ним ассоциируется компонент, в который вводится выбранное значение. Имя этого компонента определяется при помощи свойства Associate. Минимальное, максимальное и текущее значение параметра, устанавливаемого с помощью компонента, задается свойствами Min, Max и Position.

Программирование на языке высокого уровня 09.03.01

60