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

        Account::Account( LinkedList< Account >* pList ,

                              unsigned accNo )

        {

            /* Инициализация данных-членов */

_________________

368 стр. Часть 6. Великолепная десятка

            accountNumber = accNo ;

            balance = 0 ;

            /* Внесение в список */

            pNode = new Node< Account >( pList , this ) ;

            pList -> addNode( pNode ) ;

            count++ ;

        }

        /* Функции доступа */

        int accountNo( ) { return accountNumber ; }

        double acntBalance( ) { return balance ; }

        static int noAccounts( ) { return count ; }

        static Account* first( LinkedList< Account >* pLinkedList )

        {

            Node< Account >* pNode = pLinkedList -> firstNode( ) ;

            return pNode -> current( ) ;

        }

        Account* next( )

        {

            Node< Account >* pNextNode = pNode -> next( ) ;

            return pNextNode -> current( ) ;

        }

        /* Функции транзакций */

        void deposit( double amount ) { balance += amount ; }

        virtual bool withdrawal( double amount )

        {

            if ( balance < amount )

            {

                cout << "Недостаточно денег: на счету " << balance

                      << ", снимаем " << amount

                      << endl ;

                return false ;

            }

            balance -= amount ;

            return true ;

        }

        /* Функция вывода на экран */

        void display( )

        {

            cout << type( )

                   << " счёт " << accountNumber

                   << " = " << balance

                   << endl ;

        }

        virtual char* type( ) = 0 ;

      protected :

        Node< Account >* pNode ;

        static int count ; /* Количество счетов */

        unsigned accountNumber ;

        double balance ;

    } ;

_________________

369 стр. Глава 31. Программа BUDGET 

    /* Переменная для сбора статистики */

    int Account::count = 0 ;

    /* Checking — свойства, уникальные для чекового счёта */

    class Checking : public Account

    {

      public :

        Checking::Checking( LinkedList< Account >* pLL ,

                          unsigned accNo ) :

         Account( pLL , accNo )

        { }

        /* Перегрузка чисто виртуальных функций */

        virtual bool withdrawal( double amount ) ;

        virtual char* type( ) { return "Чековый" ; }

    } ;

    /* withdrawal — перегрузка Account::withdrawal( ) */

    bool Checking::withdrawal( double amount )

    {

        bool success = Account::withdrawal ( amount ) ;

        if ( success && balance < 500.00 )

        {

            balance -= 0.20 ;

        }

        return success ;

    }

    /* Savings — свойства, уникальные для сберегательного счёта */

    class Savings : public Account

    {

      public :

        Savings::Savings( LinkedList< Account >* pLL ,

                            unsigned accNo ) :

            Account( pLL , accNo )

        { noWithdrawals = 0 ; }

        /* Функции транзакций */

        virtual bool withdrawal( double amount ) ;

        virtual char* type( ) { return "Savings" ; }

      protected :

        int noWithdrawals ;

    } ;

    /* withdrawal — перегрузка Account::withdrawal( ) */

    bool Savings::withdrawal( double amount )

    {

        if ( ++noWithdrawals > 1 )

        {