С++ для начинающих




Пример связанного списка - часть 4


Конструктор ilist_item требует задания значения и необязательного параметра – адреса существующего объекта ilist_item. Если этот адрес задан, то создаваемый объект ilist_item будет помещен в список после указанного. Например, для списка

0 1 1 2 5

вызов конструктора

ilist_item ( 3, pointer_to_2 );

модифицирует последовательность так:

0 1 1 2 3 5

Вот реализация ilist_item. (Напомним, что второй параметр конструктора является необязательным. Если пользователь не задал второй аргумент при вызове конструктора, по умолчанию употребляется 0. Значение по умолчанию указывается в объявлении функции, а не в ее определении; это поясняется в главе 7.)

class ilist_item {

public:

    ilist_item( int value, ilist_-item *item_to_link_to = 0 );

     // ...

};

inline

ilist_item::

ilist_item( int value,   ilist_item *item )

           : _value( value )

{

    if ( item )

        _next = 0;

    else {

        _next = item->_next;

        item->_next = this;

}

Операция insert() в общем случае работает с двумя параметрами – значением и адресом элемента, после которого производится вставка. Наш первый вариант реализации имеет два недочета. Сможете ли вы их найти?

inline void

ilist::

insert( ilist_item *ptr, int value )

{

    new ilist_item( value, ptr );

    ++_size;

}

Одна из проблем заключается в том, что указатель не проверяется на нулевое значение. Мы обязаны распознать и обработать такую ситуацию, иначе это приведет к краху программы во время исполнения. Как реагировать на нулевой указатель? Можно аварийно закончить выполнение, вызвав стандартную функцию abort(), объявленную в заголовочном файле cstdlib:

#include <cstdlib>

// ...

if ( ! ptr )

    abort();

Кроме того, можно использовать макрос assert(). Это также приведет к аварийному завершению, но с выводом диагностического сообщения:

#include <cassert>

// ...

assert( ptr != 0 );

Третья возможность – возбудить исключение:

if ( ! ptr )

    throw "Panic: ilist::insert(): ptr == O";




Содержание  Назад  Вперед