Выбрать главу

«Ещё одной причиной для использования пространств имён служат так называемые "коллизии имён", которых надо избегать. Например, класс Grade из пространства имён Schools никак не влияет на возможность использования этого же имени для класса в пространстве имён FoodProduction

[Советы]

Реализация класса student...261

Реализация класса Student помещена мною в файл Student.срр.

    /* Student — реализация методов класса Student */

    #include <cstdio>

    #include <cstdlib>

    #include <iostream>

    #include <string.h>

    #include "student.h"

    namespace Schools

    {

        Student::Student( char* pszNameArg , int nIDArg )

            : nID( nIDArg )

        {

            pszName = new char[ strlen( pszNameArg ) + 1 ] ;

            strcpy( pszName , pszNameArg ) ;

        }

        /* display — возвращает описание студента */

        char* Student::display( )

        {

            /* Копируем имя студента в блок памяти в куче, который возвращается вызывающей функции */

            char* pReturn = new char[ strlen( pszName ) + 1 ] ;

            strcpy( pReturn , pszName ) ;

            return pReturn ;

        }

    }

Конструктор Student копирует имя и идентификатор студента, переданные ему в качестве аргументов. Виртуальная функция display( ) возвращает строку с описанием объекта Student.

Компиляция файла Student.срр даёт промежуточный файл, который затем может быть быстро объединён с другими файлами в завершённую выполнимую программу.

_________________

261 стр. Глава 22. Разложение классов

«По историческим причинам в большинстве сред С++ этот промежуточный файл имеет расширение .obj или ( "объектный файл" ).»

[Технические подробности]

Разделение программы - класс 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( ) ;