protected:
ListOfRoom rooms;
ListOfPerson people;
};
typedef long Room_ID;
class Room
{
public:
Room( String name, Room_ID id, int capacity. String directions description = "" );
~Room();
Calendar_Class Calendar();
protected:
Calendar_Class calendar;
int capacity;
Room_ID id;
String name;
String directions; // где этот гостиничный номер?
String description;
};
typedef long Person_ID;
class Person
{
public:
Person ( String name, Person_ID id );
~Person();
Calendar_Class Calendar(); // место доступа для добавления встреч
protected:
Calendar_Class calendar;
Person_ID id;
String name;
};
class Calendar_Class
{
public:
Calendar_Class();
~Calendar_Class();
void Add( const Meeting& ); // добавляем встречу в календарь
void Delete( const Meeting& );
Meeting* Lookup( Time ); // проверяем, не назначена ли уже встреча на это чис-
Block( Time, Duration, String reason = "" );
// резервируем время...
protected:
OrderedListOfMeeting meetings;
};
class Meeting
{
public:
Meeting( ListOfPerson&, Room room, Time when, Duration duration, String purpose = "" );
~Meeting();
protected:
ListOfPerson people;
Room room;
Time when;
Duration duration;
String purpose;
};
1. Какова разница между шаблоном и макросом?
Шаблоны являются средствами программирования языка C++, поддерживающими контроль за соответствием типов данных. Макросы выполняются препроцессором и не обеспечивают безопасности работы с типами.
2. В чем состоит отличие параметра шаблона от параметра функции?
Параметр шаблона используется для создания экземпляра шаблона для каждого типа. Если создать шесть экземпляров шаблонов, то будут созданы шесть различных классов или функций. Параметры функций определяют, какие данные передаются в функцию при ее вызове, но не могут использоваться для создания разных экземпляров одной функции.
3. Чем отличается обычный дружественный шаблонный класс от дружественного шаблонного класса, специализированного по типу?
Обычный дружественный шаблонный класс создает одну функцию для всех экземпляров параметризованного класса, а специализированный по типу дружественный шаблонный класс создает специализированные по типу экземпляры функции для каждого экземпляра параметризованного класса.
4. Можно ли обеспечить особое выполнение для определенного экземпляра шаблона?
Да. Создайте для конкретного экземпляра шаблона функцию, специализированную по типу. Чтобы изменить выполнение, например, для массивов целых чисел, помимо функции Array::SomeFunction(), создайте также функцию Array::SomeFunction().
5. Сколько создается статических переменных-членов, если поместить один статический член в определение класса шаблона?
По одной для каждого экземпляра класса.
6. Что представляют собой итераторы?
Это обобщенные указатели. Итератор можно инкрементировать, чтобы он указывал на следующий узел в последовательности. К нему также можно применить операцию разыменования, чтобы возвратить узел, на который он указывает.
7. Что такое объект функции?
Это экземпляр класса, в котором определен перегруженный оператор вызова функции (). Объект функции можно также использовать как обычную функцию.
1. Создайте шаблон на основе данного класса List:
class List
{
public:
List():head(0),tail(0), tbeCount(0) { }
virtual ~List();
void insert( int value );
void append( int value );
int is_present( int value ) const;
int is_empty() const { return head == 0: }
int count() const { return theCount; }
private:
class ListCell
{
public:
ListCell(int value, ListCell *cell = ):val(value),next(cell){ }
int val;
ListCell *next;
};
ListCell *head;
ListCell *tail;
int theCount;
};
Вот один из способов выполнения этого шаблона:
template
class List
{
public:
List():head(0),tail(0),theCount(0) { }
virtual ~List();
void insert( Type value );
void append( Type value );
int is_present( Type value ) const;
int is_empty() const { return head == 0; }
int count() const { return theCount; }
private:
class ListCell
{
public:
ListCell(Type value, ListCell *cell = O):val(value),next(cell) { }
Type val;
ListCell *next;
};
ListCell *head;
ListCell *tail;
int theCount;
};
2. Напишите выполнение обычной (не шаблонной) версии класса List.
void List::insert(int value)
{
ListCell *pt = new ListCell( value, head );
assert (pt ! = 0);
// эта строка добавляется для обработки хвостового узла
if ( head -= 0 ) tail = pt,
head = pt;
theCount++;
}
void List::append( int value )
{
ListCell *pt = new ListCell( value );
if ( head — 0 )
head = pt;
else
tail->next = pt:
tail = pt;
theCount++;
}
int List::is_present( int value ) const
{
if ( head == 0 )
return 0;
if ( head->val — value || tail->val == value )
return 1;
ListCell *pt = head->next;
for (; pt != tail; pt = pt->next)
if ( pt->val == value )
return 1;
return 0;
}
3. Напишите шаблонный вариант выполнения.
template
List::~List()
{
ListCell *pt = head;
while ( pt )
{
ListCell *tmp = pt;
pt = pt->next;
delete tmp;
}
head = tail = 0;
}
template
void List::insert(Type value)
{
ListCell *pt = new ListCell( value, head );
Читать дальше