Стек. Продолжим разговор.



Комментарии

2 комментария(ев)
аватар: Uranium
Uranium
Дата: Пнд, 10/10/2011 - 01:35
Звание: Энтузиаст
Сообщений: 119

Внесу несколько уточняющий моментов.

1. Забудьте про всякие "stdafx.h" и _tmain. Этого нет в Стандарте, поэтому могут возникнуть большие проблемы с переносимостью. А жить по закону(по стандарту), надо даже в таких простых примерах.

2. Если вы реализуете стек, то реализуйте его по всем правилам, где освобождение памяти(empty)? где возвращение количества элементов(size)? Где вообще деструктор? Это тот минимум, который должен включать каждый класс, реализующий стек. Без этого, вышеприведённый код назвать стеком сложно.

3. template <typename StackType> ostream &operator<< <StackType>(ostream &stream, Stack <StackType> &obj)

Насколько я помню, это называется частичная специализация шаблона функции. Если так, то вряд ли что-то заработает, там более выше, вы определяете совершенно другое
template <typename StackType> ostream &operator<<(ostream &stream, Stack <StackType> &obj);

4. В push() , если исключение произошло уже после выделения памяти, то память опять же останется не освобождённой. Поэтому лучше продумать реализацию, которая учитывает такую ситуацию. Вобще смысла в bad_alloc в данном случае нет, так как существует ещё некоторое количество проблем в виде отсутствия места для выделения памяти, которое не будет поймано.

5. В функции pop() тоже не всё однозначно. При пустом стеке, на мой взгляд, более правильно бросить исключение, а не выводить сообщение. Так как при извлечении несуществующего элемента, в данном случае не блокирует выполнение программы. Конечно, разные задачи разные реализации, но всё равно, я бы сделал так

if(top == 0) throw "Stack is empty";

Хотя конечно, лучше реализовать отдельный класс для обработки исключений

Если я в чём то не прав, то поправьте.

аватар: krabche
krabche
Дата: Втр, 11/10/2011 - 02:41
Звание: Посвященный
Сообщений: 457

1. Деструктор должен быть обязательно, если класс использует динамическую память. Его нет.
2. Так же считаю что operator<< два раза написан не нужен. Даже не очень понимаю как это должно компилироваться.
3. Конечно не хватает еще некоторых методов, ну просим это тем, что это просто пример.
Теперь добавлю от себя
3. Теперь по моему самое главное. Почему top это указатель на Stack!?? По моему должен быть
StackType *top;
Так как у тебя вроде сделан обычный список через указатели. А у тебя получается список классов Stack каждый из которых хранит элемент.
Я конечно не против но я бы сделал по другому вообще. Тоесть внутри класса Stack сделал бы обычный список из StackType, а не список из Stack.
Ну наверно все.