Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
FireProoF
17 / 17 / 1
Регистрация: 28.10.2012
Сообщений: 193
#1

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

25.02.2013, 17:41. Просмотров 567. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2013, 17:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс Стек Stack. не работает класс исключений (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
anmartex
...
1706 / 1199 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
26.02.2013, 06:51 #2
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
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
26.02.2013, 10:04 #3
Немного здоровой критики.
Цитата Сообщение от 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2013, 10:04
Привет! Вот еще темы с ответами:

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

Создать параметризированный класс Stack - C++
Помогите пожалуйста Создать параметризированный класс Stack. Класс должен содержать конструкторы, деструктор, а также функции push, pop,...

Разработать шаблонный класс Stack - C++
На С++ разработать шаблонный класс Stack (стек)для представления одномерных динамических массивов. Класс должен обеспечивать хранение...

Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами - C++
Здравствуйте! Никак не могу продумать структуру этой программы. Проходим наследование, но я все равно не знаю, как его здесь применить. Как...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru