Здравствуйте, я пытаюсь воспроизвести похожее на 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
при создании такой структуры?
Надеюсь на помощь,спасибо!
Вам нужно гуглить безопасность исключений (exception safely). Советую почитать Майерса, в первую очередь, "Эффективное использование C++. 55 верных советов...". Прочитать Modern C++ также полезно, но только после прочтения предыдущей.
Если в кратце: декларация throw(bad_alloc)
является устаревшей в С++11 и C++14. Если функция не бросает исключений, используйте noexcept, или throw(), если это C++98. Если бросает, просто документируйте. Реально полезной может быть информация о том, что функция никогда не бросает исключений, тогда компилятор может применить лучшие оптимизации.
Список (хотя в вашем случае это вектор, стоит использовать устоявшееся в экосистеме C++ название) может выбрасывать исключения как минимум в случае добавления новых элементов. При этом исключение может возникнуть из-за нехватки памяти, или его может бросить конструктор создаваемого в списке элемента. В обоих случаях вы должны просто игнорировать его, пропуская наружу, но нужно следить, что бы не произошло утечек ресурсов и ваш список находился в допустимом состоянии. Для этого желательно использовать умные указатели, std::unique_ptr, например. Кроме того, исключение может возникнуть при копировании/перемещении элементов, и их тоже нужно пропускать наружу, но при этом нужно не допускать некорректного состояния списка. Майерс достаточно подробно эту тему освещает.
А вот деструктор, по хорошему, вам вообще писать не надо, он должен генерироваться автоматически при использовании умных указателей. Но если вы реализуете действительно список, а не массив, деструктор нужен, т.к. автоматически сгенерированный деструктор будет рекурсивным, его нужно развернуть в цикл.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Как написать оператор *= для длинных беззнаковых чисел методом умножения в столбик (длинная арифметика) без использования оператора *, если...
Есть проект на C++ при компиляции, которого при использование версии g++ (gcc) 49
Здравствуйте, подскажите , пожалуйста, ошибкуНе могу найти в чем проблема