Читайте также:
|
|
Это ключевое слово может применяться в двух случаях. Во-первых, им можно заменять ключевое слово class в списке параметров шаблона. Такое дополнение сделано в ANSI C++ потому, что ключевое слово class в списке параметров не вполне отражает положение дел;
параметром шаблона может быть любой тип, а не только класс, и стандартный синтаксис может вводить некоторых в заблуждение. Следующие две нотации эквивалентны:
template <class T> class SomeClass {...};
template <typename T> class SomeClass {...};
Во-вторых, typename необходимо, если шаблон определяет некоторые объекты еще не объявленных типов. Рассмотрите такой шаблон функции:
template <class T>
void Func(Т Sargi, typename T::Inner arg2)
{
typename T::Inner tiObj;
// Локальный объект
// типа Т::Inner.
//...
31. Объектно-ориентированные приложения. Объектно-ориентированные стековые операции в С++. Объектно-ориентированный связанный список в С++. Динамическое распределение памяти: связанные списки. Особенности использования связанных списков
выделять память динамически- память для хранения структур запрашивается по мере роста списка. Для динамического распределения памяти можно использовать связанные списки.
Связанный список — это набор структур, каждая из которых имеет некоторый элемент, или указатель, ссылающийся на другую структуру в этом списке. Указатель служит для связи между структурами. Эта концепция напоминает массив, однако она позволяет динамически увеличивать список. На рис. 14.1 показан простой связанный список для программы, работающей с реестром катеров фирмы Nineveh Boat Sales.
Связанный список для данного примера включает указатель на следующий катер в реестре:
struct stboat {
char sztype[15];
char szmodel[15];
char sztitie[20];
char szcomment[80];
int iyear;
long int lmotor_hours;
float fretail;
float fwholesale;
struct stboat *nextboat;
} Nineveh, *firstboat,*currentboat;
Пользовательский структурный тип stboat называется ссылочной структурой, поскольку он имеет поле, содержащее адрес другой, аналогичной структуры. Указатель nextboat (следующий катер) хранит адрес следующей связанной структуры. Это позволяет указателю *nextboat первой структуры ссылаться на вторую структуру и так далее. Такова концепция связанного списка структур.
Особенности использования связанных списков
Следующий фрагмент программы показывает, как аналогичный оператор можно применить для последующего выделения памяти каждой дополнительной структуре. Процесс продолжается в цикле while до тех пор, пока имеются данные для обработки:
while (datain(&Nineveh) == 0) {
currentboat -> nextboat = (struct stboat *) new (struct stboat);
if (currentboat -> nextboat == NULL) return(l);
currentboat = currentboat -> nextboat;
*currentboat = Nineveh; }
Для того чтобы продемонстрировать передачу структуры в качестве параметра, в начале цикле while адрес структуры stboat, & Nineveh, передается в функцию datain(). Эта функция заносит в структуру действительные данные или возвращает значение 1, если пользователь нажал символ "Q", означающий окончание ввода. Если функция datain() не возвращает 1, то указателю currentboat->nextboat присваивается адрес динамически созданной структуры stboat. Обратим внимание на то, что выполняется приведение типа (struct stboat *) адреса, возвращаемого функцией new(), для того, чтобы согласовать его с типом принимающей переменной. Оператор if проверяет, был ли успешным вызов функции new (). (При ошибке new () возвращает значение null.)
Назначение переменной currentboat — хранить адрес последней действительной структуры stboat в списке; поэтому оператор, следующий за if, присваивает переменной currentboat адрес нового элемента списка, а именно — новый адрес nextboat.
Последний оператор в цикле копирует содержимое структуры Nineveh типа stboat в новую динамически созданную структуру, на которую ссылается указатель * currentboat. Указатель в последней структуре списка установлен на null — это означает конец связанного списка.
Во многих языках высокого уровня связанные списки позволяют создавать программы, весьма эффективно использующие память; зачастую эти программы — самые сложные для отладки.
32.Законченный проект программы со связанным списком и всеми (семью) характеристиками ООП. Создание родительского класса. Производные классы-потомки. Использование дружественного класса. Анализ законченной программы объектно-ориентированного связанного списка в С++.
// РОДИТЕЛЬСКИЙ КЛАСС
class NNR
{ friend class payroll_list;
protected:
char lstname[20]; char fstname[15]; char job_title[30]; char social_sec[12]; int year_hired; NNR *pointer; NNR *next_link;
public:
NNR(char *lname, char *fname, char *ss, char *job, int y_hired)
{ strcpy(lstname, lname); strcpy(fstname, fname);
strcpy(social_sec, ss); strcpy(job_title, job);
year_hired = y_hired; next_link = 0;}
…
В приведенной программе на основе общего родительского класса строятся несколько классов-потомков. Родительский класс для данного примера связанного списка называется NNR. Связанный список представляет собой базу данных, содержащую служебную информацию и платежные ведомости сотрудников фирмы. Родительский класс NNR хранит сведения, общие для всех порождаемых на его основе классов-потомков. В данном примере используется следующая общая информация: фамилия и имя сотрудника, должность, номер социальной страховки и стаж работы в фирме. Базовый класс NNR имеет три уровня защиты: public, рrotected и рrivate. В разделе рrotected этого класса содержится структура, хранящая данные, общие для всех производных классов. Раздел public (методы класса) показывает, какими способами можно обращаться к этой информации из функции main().Родительский класс и все производные классы используют дружественный класс, названный раyroll_list.
Дата добавления: 2015-12-08; просмотров: 64 | Нарушение авторских прав