Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

. Окно в интерактивной программе которое владеет такими элементами как поля ввода и редактирования данных

Работа добавлена на сайт samzan.net: 2016-03-13

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 3.5.2024

ИЕРАРХИЯ ОБЪЕКТОВ И ГРУППА. ИТЕРАТОРЫ

Цель. Получить практические навыки создания объектов-групп и использования методов-итераторов.

Основные теоретические сведения.

Группа.

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

Примеры групп:

1. Окно в интерактивной программе, которое владеет такими элементами, как поля ввода и редактирования данных, кнопки, списки выбора, диалоговые окна и т.д. Примерами таких окон являются объекты классов, порожденных от абстрактного класса TGroup( TDeskTop, TWindow, TDialog) в иерархии классов библиотеки Turbo Vision, и объекты классов, порожденных от TWindowObject в иерархии классов библиотеки OWL.

2. Агрегат, состоящий из более мелких узлов.

3. Огород, состоящий из растений, системы полива и плана выращивания.

4. Некая организационная структура (например, ФАКУЛЬТЕТ, КАФЕДРА, СТУДЕНЧЕСКАЯ ГРУППА).

Мы отличаем “группу” от “контейнера”. Контейнер используется для хранения других данных. Примеры контейнеров: объекты класса TCollection библиотеки Turbo Vision и объекты контейнерных классов библиотеки STL  в C++ (массивы, списки, очереди).

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

Группа дает второй вид иерархии (первый вид  иерархия классов, построенная на основе наследования)  иерархию объектов (иерархию типа целое/часть), построенную на основе агрегации.

Реализовать группу можно несколькими способами:

1. Класс “группа” содержит поля данных объектного типа. Таким образом, объект “группа” в качестве данных содержит либо непосредственно свои элементы, либо указатели на них

class TWindowDialog: public TGroup

      {

       protected:       

      TInputLine input1;

      TEdit   edit1;

      TButton button1;

      /*другие члены класса*/

      };

Такой способ реализации группы используется в C++Builder.

2. Группа содержит член-данное last типа TObject*, который указывает на начало связанного списка объектов, включенных в группу. В этом случае объекты должны иметь поле next типа TObject*, указывающее на следующий элемент в списке.Такой способ используется при реализации групп в Turbo Vision.

3. Создается связанный список структур типа TItem:

      struct TItem

      {TObject* item;

       TItem* next;};

Поле item указывает на объект, включенный в группу. Группа содержит поле last типа TItem *, которое указывает на начало связанного списка структур типа TItem.   

Если необходим доступ элементов группы к ее полям и методам, объект типа TObject должен иметь поле owner типа TGroup*, которое указывает на собственника этого элемента.

Методы группы.

Имеется два метода, которые необходимы для функционирования группы:

1) void Insert(TObject* p);

Вставляет элемент в группу.

2) void Show();

Позволяет просмотреть группу.

Кроме этого группа может содержать следующие методы:

1) int Empty();

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

2) TObject*  Delete(TObject* p);

Удаляет элемент из группы, но сохраняет его в памяти.

3) void DelDisp(TObject* p);

Удаляет элемент из группы и из памяти.

Иерархия объектов.

Иерархия классов есть иерархия по принципу наследования, т.е. типа “это есть разновидность того”. Например, “рабочий есть разновидность персоны”,  “автомобиль”  есть  разновидность “транспортного средства”. В отличие от этого иерархия объектов  это иерархия по принципу вхождения, т.е. типа это есть часть того”. Например, установка  часть завода”, “двигатель”  часть “автомобиля”. Таким образом, объекты нижнего уровня иерархии включаются в объекты более высокого уровня, которые являются для них группой.

Итератор.

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

For all элементов набора { действия}

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

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

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

Определим тип указателя на функцию следующим образом:

typedef  void(*PF)(TObject*,< дополнительные параметры>);

Функция имеет обязательный параметр типа TObject или TObject*, через который ей передается объект, для которого необходимо выполнить определенные действия.

Метод-итератор объявляется следующим образом:

void TGroup::ForEach(PF action,< дополнительные параметры >);

где

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

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

Затем определяется указатель на функцию и инициализируется передаваемой итератору функцией.

PF pf=myfunc;

Тогда итератор будет вызываться, например, для дополнительного параметра типа int, так:

gr.ForEach(pf,25);

Здесь gr  объект-группа.

Динамическая идентификация типов. 

Динамическая идентификация типа характерна для языков, в которых поддерживается полиморфизм. В этих языках возможны ситуации, в которых тип объекта на этапе компиляции неизвестен.

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

Пусть группа содержит объекты различных классов и необходимо выполнить некоторые действия только для объектов определенного класса. Тогда в итераторе мы должны распознавать  тип очередного объекта.

В стандарт языка С++ включены средства RTTI (Run-Time Type Idendification)  динамическая идентификация типов. Эти средства реализованы в последних системах Borland C++ (версий 4.0 и выше).

Информацию о типе объекта получают с помощью оператора typeid, определение которого содержит заголовочный файл  <typeinfo.h>.

Имеется две формы оператора typeid:

typeid (объект)

typeid (имя_типа)

Оператор typeid возвращает ссылку на объект типа type_info.

В классе type_info перегруженные операции == и != обеспечивают сравнение типов.

Функция name () возвращает указатель на имя типа.

Имеется одно ограничение. Оператор typeid работает корректно только с объектами, у которых определены виртуальные функции. Большинство объектов имеют виртуальные функции, хотя бы потому, что обычно деструктор является виртуальным для устранения потенциальных проблем с производными классами. Когда оператор typeid применяют к неполиморфному классу (в классе нет виртуальной функции), получают указатель или ссылку базового типа.

Примеры.

1.

#include<iostream.h>

#include<typeinfo.h>

class Base{

virtual void f(){};

//…

};

class Derived: public Base{

//…

};

void main()

{int i;

Base ob,*p;

Derived ob1;

cout<<typeid(i).name();    //Выводится int

p=&ob1;

cout<<typeid(*p).name();  // Выводится Derived

}

2.

//начало см. выше

void WhatType(Base& ob)

{cout<< typeid(ob).name()<<endl;

}

void main()

{

Base ob;

Derived ob1;

WhatType(ob);    //Выводится Base

WhatType(ob1);  //Выводится Derived

}

3.

//начало см. выше

void main()

{

Base *p;

Derived ob;

p=&ob;

if(typeid(*p)==typeid(Derived)) cout<<“p указывает на объект типа Derived”;

}

Если при обращении typeid(*p), p=NULL, то возбуждается исключительная ситуация bad_typeid




1. Реферат Кредитний ризик та методи управління ними
2. Совершенствование организационной структуры службы маркетинга в организации (На материалах предприятия ОАО
3. Томас Гоббс о государстве
4. Тема 2 ТЕМА 2
5. БАШКИРСКИЙ ГОСУДАРСТВЕННЫЙ АГРАРНЫЙ УНИВЕРСИТЕТ
6. с момента пленения отца или с момента его смерти в плену Как вернее определить ситуацию порожденную плен
7. Горбачев и его перестройка
8. 30 их общего объёма и имеющая филиалы в двух и более странах
9.  Сделать анкету 2
10. Методика воспитания скоростных способностей спортсмена-ориентировщика
11. крестиками Определить сумму очков набранную каждым участником турнира
12. Podstwowymi ~r~d~mi prw prcy s~-
13. Классификация лесных насаждений по устойчивости
14. тематика рефератов и контрольных работ по теоретическому разделу программы- Диагноз и краткая характерист
15. 20р. ЗВІТ про підсумки проведення практики курсанта 301 навчальної групи Навчаль
16. Статья 1 Правительство Российской Федерации высший исполнительный орган государственной власти Российско
17. Параллелограммом называется четырехугольник у которого противолежащие стороны попарно парал
18. родственных связей 17 век итальянский философ Вико
19. Ледовое побоище на Чудском озере 1243 г.
20. темастр