Вопросы к ЛР ответы (1077229), страница 2
Текст из файла (страница 2)
Значения переменных и их адресов можно просматривать в течение выполнения всей программы.
18. Array потомок класса Collection, не является абстрактным.
19. Array является дочерним
20. Collection – косвенный базовый класс для Array.
Контрольные вопросы к ЛР №3
-
Поясните структуру классов для LIST по диаграмме классов?
-
Какие данные и методы определены в этом классе?
-
Для чего используется класс LISTITERATOR? Его методы?
-
Поясните структуру объектов для программы по диаграмме объектов? Какие объекты являются временными, и какие сохраняются в программе все время ее работы?
-
Что такое наследование классов? Поясните на примере MyObj?
-
Для чего нужен класс Object в системе классов BC 3.1?
-
Что такое абстрактный класс?
-
Какие преимущества появляются у программиста при использовании проектов в BC++?
-
Какие классы являются дружественными классу LIST, классу ListElement? Покажите эти отношения на диаграмме классов.
-
В каком отношении находятся классы LIST и ListElement?
-
Почему нужно перегружать стандартные виртуальные функции класса Object?
-
Для чего может быть использован метод – findPred класса LIST? Можно ли его использовать в программе, в порожденном классе? Если нет, то почему?
-
Как должен быть описан класс наследник от Object( MyObj)?
-
Назначение и использование метода detach, flush? Чем ониотличаются?
-
Назначение и использование методов int, restart и current?
-
Поясните запись – “ListIterator LBI((List)LB);”?
-
Поясните записи – “int(LBI)” и “LBI++”?
-
Что нужно для просмотра классов программы? Как ее распечатать?
-
Для чего нужен класс ListElement и где можно найти его описание?
-
Можно ли создавать объекты класса ListElement вне методов класса LIST?
-
Можно ли по текущему элементу списка определить следующий или предыдущий объект списка?
-
Какие чистые виртуальные функции переопределены в класса LIST?
-
Какие чистые виртуальные функции переопределены в класса LISTITERATOR?
-
Можно ли удалить элемент в списке по номеру?
-
Почему новые объекты могут быть добавлены только в начало списка? Пояснить по распечатке метода add в исходном модуле.
-
Можно ли использовать для объектов класса LIST методы printHeader, printSeparator и printTrailer из класса родителя Container класса LIST? И как?
1.
2. class _CLASSTYPE List : public Collection, private ListBlockInitializer
{
public:
List();
virtual ~List() {flush();}
Object _FAR & peekHead() const {return ptrToRef(head->next->data);}
void add( Object _FAR & );
virtual void detach( Object _FAR &, DeleteType = NoDelete );
virtual void flush( DeleteType = DefDelete );
virtual int isEmpty() const;
virtual countType getItemsInContainer() const;
virtual ContainerIterator _FAR & initIterator() const;
virtual classType isA() const;
virtual char _FAR *nameOf() const;
private:
class _CLASSTYPE ListElement{}
ListElement _FAR *head;
ListElement _FAR *tail;
ListElement headEntry, tailEntry;
unsigned itemsInContainer;
ListElement _FAR *findPred( const Object _FAR & o );
friend class ListIterator;
friend class ListBlockInitializer;
};
3. ListIterator – класс итераторов для списка, является производным классом от ContainerIterator. (Итератор позволяет перебирать элементы списка)
ListIterator( const List _FAR & );
virtual ~ListIterator();
virtual operator int();
virtual Object _FAR & current();
virtual Object _FAR & operator ++ ( int );
virtual Object _FAR & operator ++ ();
virtual void restart();
4.
5. Насле́дование — один из механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.
В нашем случае: MyObj имеет все методы класса Object (некоторые из которых перегружены), а также собственные, не относящиеся к Object, методы и данные
6. Является базовым классом для большинства классов библиотеки BC 3.1. (находится вершине иерархии классов).
7. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод (идентификатор: …=0), он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного.
8.
9. class _CLASSTYPE List:
friend class ListIterator;
friend class ListBlockInitializer;
class _CLASSTYPE ListElement:
friend class List;
friend class ListIterator;
friend class ListBlockInitializer;
10. ListElement – локальный класс, определен внутри класса List. Отношение включения:
ListElement _FAR *head;
ListElement _FAR *tail;
ListElement headEntry, tailEntry;
11. Потому как они являются чисто виртуальными – то есть не имеют тела. Если мы хотим создавать объекты класса, производного от Object, все такие методы должны быть перегружены – класс будет не виртуальным.
12. При удалении элемента из списка, методом detach(), находят элемент, находящийся перед удаляемым. Не может, так как является закрытым (private).
13. Если мы хотим создавать объекты от полученного класса, должны перегрузить все чисто виртуальные методы класса Object.
14. virtual void detach( Object _FAR &, DeleteType = NoDelete ); –
удаляет ссылку на объект из списка
virtual void flush( DeleteType = DefDelete ); - очищает весь список.
15. virtual operator int(); - оператор явного или неявного приведения к целочисленному типу (не 0 – если текущий элемент не равен следующему за ним.)
virtual Object _FAR & current(); - возвоащает ссылку на текущий элемент списка.
virtual void restart(); - перемещает итератор в начало списка (текущая позиция итератора = стартовой)
16. “ListIterator LBI((List)LB);” – создать итератор для списка (экземпляр класса ListIterator) на основе списка LB.
17. “int(LBI)” – преобразовать итератор к целочисленному типу
“LBI++” – увелечить значение итератора на 1 – перейти к следующему элементу списка, если он есть.
18.
19. ListElement – класс, описывающий элемент списка, содержащего какие-то данные и указатель – указатель на следующий элемент списка. Описан внутри класса List (List.h)
20. Нет, нельзя, так как описан в секции private – является недоступным внешним функциям.
21. С помощью итераторов:
- в списке List: следующий
- в списке DobleList: следующий и предыдущий
22. add, detach, flush, isA, nameOf, initIterator.
virtual classType isA() const = 0;
virtual char _FAR *nameOf() const = 0;
virtual void flush( DeleteType = DefDelete ) = 0;
virtual ContainerIterator _FAR & initIterator() const = 0;
virtual void add( Object _FAR & ) = 0;
virtual void detach( Object _FAR &, DeleteType = NoDelete ) = 0;
23. // ContainerIterator:
virtual operator int() = 0;
virtual Object _FAR & current() = 0;
virtual Object _FAR & operator ++ ( int ) = 0;
virtual Object _FAR & operator ++ () = 0;
virtual void restart() = 0;
24. Нет, detach удаляет объект из списка по значению.
25. Потому как метод add добавляет объект в начало списка.
void List::add( Object& toAdd )
{
ListElement *newElement = new ListElement( &toAdd, head->next );
CHECK( newElement != 0 );
head->next = newElement;
itemsInContainer++;
}
-
Да, можно.
void MyList::PrintList( ostream& outputStream ) const
{
// contain.cpp
ContainerIterator& print_Iterator = initIterator();
printHeader( outputStream );
while( print_Iterator != 0 )
{
print_Iterator++.printOn( outputStream );
if ( print_Iterator != 0 )
printSeparator( outputStream );
else
break;
}
printTrailer( outputStream );
delete &print_Iterator;
}
-
Контрольные вопросы к ЛР №4
-
Поясните структуру классов программы по диаграмме классов?
-
Поясните структуру объектов программы по диаграмме объектов?
-
Что такое абстрактный класс? Пример.
-
Почему нельзя создавать объекты абстрактных классов?
-
Что такое перегрузка функций С++?
-
Что такое перегрузка операций в С++?
-
Что такое виртуальная функция ( ВФ)? Чистая ВФ? Пример по программе.
-
Что такое виртуальный вызов? Его преимущество?
-
Поясните записи – “pAbs ->print();” и “d2.print();”?
-
Поясните запись – “(( Abstr *) &LAI.current())->print();”?
-
Что такое виртуальный вызов? Покажите в программе.
-
Зачем для виртуального вызова нужен указатель на базовый класс?
-
В чем преимущества виртуального вызова для разработчиков программ?
-
Для чего нужен файл *.DEF в проекте?
-
Как обеспечить совместное использование программ С и С++?
-
Что такое виртуальный класс?
-
Что такое виртуальный деструктор? Как их можно использовать?
-
Чем отличается статическое и динамическое связывание?
-
В чем состоят преимущества динамического связывания, и как они могут использоваться в программах?
Контрольные вопросы к ЛР №5
-
Поясните понятие перегрузки функций?
-
Поясните понятие перегрузки операций?
-
Поясните назначение шаблонов функций?
-
Поясните понятие параметров функций по умолчанию?
-
Приоритет параметров по умолчанию имеет описание или прототип функции?
-
Какие виды перегрузки операций Вы знаете?
-
В чем особенность внешней перегрузки?
-
В чем особенность внутренней перегрузки?
-
В чем особенность перегрузки одноместной операции?
-
Какие операции С++ нельзя перегрузить?
-
Почему нельзя сделать внутреннюю перегрузку вывода в cout?
-
Можно ли перегрузить трехместную операцию для своего класса?
-
В чем особенность перегрузки двухместной операции?
-
Какие меры нужно предпринять, чтобы при двуместной внутренней перегрузке значение базовой переменной было сохранено?
-
В каких случаях можно передавать переменную через стек, а каких посредством указателя?
-
Каково назначение перегрузки функций с точки зрения программиста?
-
Каково назначение перегрузки операций с точки зрения программиста?
-
Какие ограничения перегрузки операций Вы знаете?
-
Какие операции перегружены в классах потокового ввода-вывода?
-
Какие операции перегружены в классах LISTITERATOR и ARRAYITERATOR?