<p id="chapter22.3.4"><strong><emphasis>Разделение программы - класс GraduateStudent...262</emphasis></strong></p>

Следующий модуль, представляющийся квазинезависимым, — 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

    #include

    #include

    #include

    #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" и освобождает память, которую занимала исходная строка.

«Забыв освободить память, выделенную в куче, вы получите эффект, именуемый утечкой памяти. Программа с утечкой памяти поначалу работает вполне корректно, но со временем всё большее и большее количество памяти оказывается потерянным, что может привести к неработоспособности программы из-за отсутствия памяти. Обычно утечки памяти очень трудно обнаружить.»

[Атас!]

<p id="chapter22.3.5"><strong><emphasis>Реализация приложения...263</emphasis></strong></p>

Два класса — Student и GraduateStudent — разнесены по отдельным исходным файлам и размещены в пространстве имён Schools. Я написал простенькую программу, использующую оба описанных класса.

    //

    /* SeparatedMain — демонстрационное приложение, */

    /*                 разделённое на части */

    //

    #include

    #include

    #include

    #include

    #include "graduateStudent.h"

    #include "student.h"

    using namespace std ;

    /* using namespace Schools ; */

    using Schools::GraduateStudent ;

    int main( int nArgc , char* pszArgs[ ] )

    {

        Schools::Student s( "Sophie Moore" , 1234 ) ;

Перейти на страницу:

Все книги серии Для чайников

Похожие книги