Разделение программы - класс GraduateStudent...262
Следующий модуль, представляющийся квазинезависимым, — GraduateStudent. Он может быть помещён в файл Student.срр, однако ряд программ могут работать только со студентами, даже не подозревая о наличии аспирантов.
Класс GraduateStudent сделан мною максимально простым. Вот как выглядит заголовочный файл.
/* GraduateStudent — специальный тип Student */
#ifndef _GRADUATE_STUDENT_
#define _GRADUATE_STUDENT_
#include "student.h"
namespace Schools
{
class GraduateStudent : public Student
{
public :
/* Тривиальный конструктор */
GraduateStudent( char* pszName , int nID )
: Student( pszName , nID ){ }
/* Демонстрация виртуальной функции */
virtual char* display( ) ;
} ;
}
#endif
Обратите внимание, что файл GraduateStudent.h включает файл Student.h. Это связано с тем, что класс GraduateStudent зависит от определения класса Student. Файл с исходным кодом содержит реализацию метода display( ).
/* GraduateStudent — специальный тип Student */
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string.h>
#include "graduateStudent.h"
namespace Schools
{
char* GraduateStudent::display( )
{
/* Описание студента */
char* pFirst = Student::display( ) ;
/* Добавляем этот текст */
char* pSecond = "-G" ;
/* Выделяем память для новой строки и создаём её */
char* pName = new char[ strlen( pFirst ) +
strlen( pSecond ) + 1 ] ;
strcpy( pName , pFirst ) ;
strcat( pName , pSecond ) ;
/* Освобождаем память, которую вернул вызов Student::display( ) */
delete pFirst ;
return pName ;
}
}
_________________
262 стр. Часть 4. Наследование
Функция display( ) из класса GraduateStudent добавляет "-G" к строке, возвращаемой функцией display( ) из класса Student. Она начинает свою работу с того, что выделяет память из кучи для новой строки.
«Никогда не надо полагаться на то, что в исходном буфере имеется достаточно места для дополнительных символов, дописываемых в конец строки.»
[Атас!]
Программа копирует в новый буфер полученную от функции display( ) из класса Student строку, добавляет к ней "-G" и освобождает память, которую занимала исходная строка.
«Забыв освободить память, выделенную в куче, вы получите эффект, именуемый утечкой памяти. Программа с утечкой памяти поначалу работает вполне корректно, но со временем всё большее и большее количество памяти оказывается потерянным, что может привести к неработоспособности программы из-за отсутствия памяти. Обычно утечки памяти очень трудно обнаружить.»
[Атас!]
Больше книг — больше знаний!
Заберите 20% скидку на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ