Создание собственного списка c++

320
15 мая 2017, 01:14

Здравствуйте, я пытаюсь воспроизвести похожее на list из библиотеки stl.

У меня имеется класс ListADT, у которого три метода конструктор, метод вставки элемента и деструктор.

#pragma once
const int defMaxListSize = 10;
typedef char DataType;
class ListADT
{
private:
    //Data members
    int maxSize;
    int size;
    int cursor;
    DataType *dataItems;
public:
    //Constructor
    ListADT(int maxNumber=defMaxListSize)throw(bad_alloc);
    //Destructor
    ~ListADT();
    //List manipulation operations
    void insert(const DataType &newDataItem)    //Insert after cursor
        throw(logic_error);
};

Конструктор - создает пустой список. Выделяет достаточно памяти для списка, содержащего количество элементов данных числом maxNumber.

Insert-вставляет элемент в конец списка, но перед эти проверяет "пуст ли список или нет?"

Деструктор - Освобождает память, используемую для хранения списка.

Для реализации я столкнулся с таким казусом,а именно, как правильно использовать исключение для таких методов. И после этого остановился на реализации этих трех методов. Не могли бы вы подсказать, как правильно обращаться с throw при создании такой структуры?

Надеюсь на помощь,спасибо!

Answer 1

Вам нужно гуглить безопасность исключений (exception safely). Советую почитать Майерса, в первую очередь, "Эффективное использование C++. 55 верных советов...". Прочитать Modern C++ также полезно, но только после прочтения предыдущей.

Если в кратце: декларация throw(bad_alloc) является устаревшей в С++11 и C++14. Если функция не бросает исключений, используйте noexcept, или throw(), если это C++98. Если бросает, просто документируйте. Реально полезной может быть информация о том, что функция никогда не бросает исключений, тогда компилятор может применить лучшие оптимизации.

Список (хотя в вашем случае это вектор, стоит использовать устоявшееся в экосистеме C++ название) может выбрасывать исключения как минимум в случае добавления новых элементов. При этом исключение может возникнуть из-за нехватки памяти, или его может бросить конструктор создаваемого в списке элемента. В обоих случаях вы должны просто игнорировать его, пропуская наружу, но нужно следить, что бы не произошло утечек ресурсов и ваш список находился в допустимом состоянии. Для этого желательно использовать умные указатели, std::unique_ptr, например. Кроме того, исключение может возникнуть при копировании/перемещении элементов, и их тоже нужно пропускать наружу, но при этом нужно не допускать некорректного состояния списка. Майерс достаточно подробно эту тему освещает.

А вот деструктор, по хорошему, вам вообще писать не надо, он должен генерироваться автоматически при использовании умных указателей. Но если вы реализуете действительно список, а не массив, деструктор нужен, т.к. автоматически сгенерированный деструктор будет рекурсивным, его нужно развернуть в цикл.

READ ALSO
Перегрузка operator[]

Перегрузка operator[]

Вот часть кода, помогите пожалуйста реализовать перегрузку оператора []

219
Умножение в столбик

Умножение в столбик

Как написать оператор *= для длинных беззнаковых чисел методом умножения в столбик (длинная арифметика) без использования оператора *, если...

300
Проблема с компиляцией, С++, error 4

Проблема с компиляцией, С++, error 4

Есть проект на C++ при компиляции, которого при использование версии g++ (gcc) 49

282
Получить значение из функции

Получить значение из функции

Здравствуйте, подскажите , пожалуйста, ошибкуНе могу найти в чем проблема

318