Ключевое слово typename

Это ключевое слово может применяться в двух случаях. Во-первых, им можно заменять ключевое слово class в списке параметров шаблона. Такое дополнение сделано в ANSI C++ потому, что ключевое слово class в списке параметров не вполне отражает положение дел;

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

template class SomeClass {...};

template class SomeClass {...};

Во-вторых, typename необходимо, если шаблон определяет некоторые объекты еще не объявленных типов. Рассмотрите такой шаблон функции:

template

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.


6363925676728709.html
6363988056553847.html
    PR.RU™