Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
17 / 17 / 3
Регистрация: 28.10.2012
Сообщений: 201

Класс Стек Stack. не работает класс исключений

25.02.2013, 17:41. Показов 2270. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Решил проверить код на пригодность, но почему то класс исключений выскакивает на ошибке.
Я никак не могу понять такие вещи как:
1. Как после того как класс EStack присвоил msg значение errmsg, это сообщение выведется на экран.
2. Когда и как и вообще задействуется ли Estack::free(); и Estack::getmsg();
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// Stack.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <malloc.h>
#include <string.h>
#include <cstring>
#ifndef STACK_H
#define STACK_H
 
# if defined(_MSC_VER)
# ifndef _CRT_SECURE_NO_DEPRECATE
# define _CRT_SECURE_NO_DEPRECATE (1)
# endif
# pragma warning(disable : 4996)
# endif
 
using namespace std;
typedef int stackdata;//ключевое слово int
/*
Вообще стек - это просто последовательность элементов. Сам класс помнит только где находится его голова, а остальные ячейки висят в памяти.
Но голова, помнит об ячейке идущей вслед за ней(предшественнице), которая, в свою очередь, помнит о своей. Таким образом и получается цепочка.
*/
struct listitem //элемент односвязного списка
{ 
    stackdata data; //данные
    listitem* next; //указатель на следующий элемент списка
};
 
// Класс исключений для CStack
class EStack
{
private:
    char* msg; // сообщение об ошибке
public:
    EStack(const char* errmsg) { msg = _strdup(errmsg);}
    ~EStack() { free(msg); }
    const char* getmsg() { return msg; }
};
//////////////////////////////////////////////////////////////////////////
 
class CStack 
{
private:
    listitem* head;//голова односвязного списка
public:
    CStack()    {head=0;}//конструктор
 
    CStack(const CStack& stack) //конструктор копирования
    {
        head=0;
        *this=stack;
    }
 
    ~CStack() {clear();}//деструктор
 
    bool empty() const {return head==0;}//проверка на пустоту
 
    CStack& clear()//очистка
    {
        while(head)
        {
            listitem* temp=head->next;
            delete head;
            head=temp;
        }
        return *this;
    }
 
    CStack& push(const stackdata& data)//заполнение
    {
        listitem* item = new listitem;//Создаём указатель и делаем его ячейкой стека
        item->data = data;//Заполняем ячейку данными. присланными извне
        item->next= head;//Указываем, что эта ячейка теперь голова стека
        head=item;//Окончательно заменяем старую голову на новую ячейку.
        return *this;//Возвращаем измененный стек
        //Бывшая голова никуда не пропала, а осталасть существовать в области памяти. Единственное, что её связывает со стеком, так это то,
        //что новая голова помнит о ней, как о предшественнице. Создается некая цепочка из ячеек.
    }
 
    stackdata pop()//извлечение
    {
        if(empty()==true) throw EStack("Stack is empty");//исключение. Если стек пуст передать в класс исключений сообщение об этом
 
        listitem* old = head;//копируем текущую голову во временную ячейку
        head=head->next;//сдвигаем голову, т.е. головой становится предыдущий эл-т
        stackdata data = old->data;//ломаем ячейку бывшей головы и достаем данные
        delete old;//убираем обломки
        return data;//возвращаем данные
    }
 
    const stackdata& peek() const
    {
        if(empty()) throw (EStack("Stack is empty"));
        return head->data;
    }
 
    CStack& operator = (const CStack& stack)
    {
        if (this == &stack) return *this;// Игнорируем попытку присвоить стек самому себе
        clear();
        if(!stack.empty())
        {
            head = new listitem;
            listitem* cur = head;
            listitem* src = stack.head;
            while(src)
            {
                cur->data = src->data;
                if(src->next)
                {
                    cur->next = new listitem;
                    cur = cur->next;
                } else
                    cur->next = 0;
                src = src->next;
            }
        }
        return *this;
    }
 
    friend ostream& operator << (ostream& s, const CStack& stack)
    {
        listitem* item = stack.head;
        while(item)
        {
            s << item->data << endl;
            item = item->next;
        }
        return s;
    }
};
#endif
int main()
{
    CStack Stack1;//создать пустой стек
    cout<<"This's Stack 1: "<<Stack1<<endl;//проверка
    CStack Stack2;//создать стек
    Stack2.push(1);//и положить в него число
    cout<<"This's Stack 2: "<<Stack2<<endl;//проверка
    Stack1.pop();//попробовать извлечь из пустого стека
    
        //
    cout<<endl;
    system("pause");
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.02.2013, 17:41
Ответы с готовыми решениями:

Создать класс СПИСОК целых чисел. Разработать класс СТЕК
&quot;Создать класс СПИСОК целых чисел. Разработать класс СТЕК, который вмещает объект класса СПИСОК. Определить необходимые конструкторы,...

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ...
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

2
...
 Аватар для anmartex
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
26.02.2013, 06:51
FireProoF, а почему у вас ни одного перехвата исключения не стоит? Ошибка выскакивает не потому, что проблема в классе исключения, а потому, что класс CStack его генерирует во время выполнения метода pop, ибо он пуст. Если бы вы поставили перехват, вы бы могли лицезреть эту ошибку. Попробуйте:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
   CStack Stack1;//создать пустой стек
   cout << "This's Stack 1: " << Stack1 << endl; //проверка
   CStack Stack2;//создать стек
   try
   {
      Stack2.push(1);//и положить в него число
      cout << "This's Stack 2: " << Stack2 << endl; //проверка
      Stack1.pop();//попробовать извлечь из пустого стека
   }
   catch (EStack& error)
   {
      cerr << "error: " << error.getmsg() << endl;
   }
 
   cout << endl;
   system("pause");
   return 0;
}
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
26.02.2013, 10:04
Немного здоровой критики.
Цитата Сообщение от FireProoF Посмотреть сообщение
// Класс исключений для CStack
C++
1
class EStack
C++
1
class EStack : public std::runtime_error
Стандартные классы для исключений есть не просто для красоты.

Цитата Сообщение от FireProoF Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CStack& push(const stackdata& data)//заполнение
{
    listitem* item = new listitem;//Создаём указатель и делаем его ячейкой стека
    item->data = data;//Заполняем ячейку данными. присланными извне
    // ...
}
 
stackdata pop()//извлечение
{
    if(empty()==true) throw EStack("Stack is empty");//исключение. Если стек пуст передать в класс исключений сообщение об этом
    // ...
}
 
const stackdata& peek() const
{
    if(empty()) throw (EStack("Stack is empty"));
    return head->data;
}
Выброс исключений почему-то выполняется при абсолютно нормальной для стека ситуации (закончились элементы), а не при действительно исключительной — если для нового элемента не была выделена память. Ну хотя тут есть std::bad_alloc, что хоть что-то, но нормальности первой ситуации это не отменяет.

Цитата Сообщение от anmartex Посмотреть сообщение
C++
1
catch (EStack& error)
C++
1
catch (const EStack& error)
const-корректность же. Нехорошо изменять исключение по пути.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.02.2013, 10:04
Помогаю со студенческими работами здесь

класс stack
Определите в программе класс stack, реализующий стек, который можно использовать для хранения символов: #define SIZE 10 //...

Класс stack
нужен пример класса стек типа char (запихать строку в стек)

класс stack
Всем привет))помогите пожалуйста....нужна прога на тему шаблоны функций и классов,при чём дан класс stack.Перегрузить операции...

класс исключений
class exception { public: exception() throw(); exception(const bad_exception &amp;ob) throw(); virtual -exception() throw(); ...

Класс Stack неробит
Доброго времени суток. Прошу помочь с реализацией класса Stack #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru