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

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

Восстановить пароль Регистрация
 
FireProoF
17 / 17 / 1
Регистрация: 28.10.2012
Сообщений: 190
25.02.2013, 17:41     Класс Стек Stack. не работает класс исключений #1
Здравствуйте! Решил проверить код на пригодность, но почему то класс исключений выскакивает на ошибке.
Я никак не могу понять такие вещи как:
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2013, 17:41     Класс Стек Stack. не работает класс исключений
Посмотрите здесь:

класс stack C++
C++ Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... C++
C++ Класс Stack неробит
C++ класс stack
C++ класс исключений
C++ Создать параметризированный класс Stack
C++ Класс stack

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
26.02.2013, 06:51     Класс Стек Stack. не работает класс исключений #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;
}
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
26.02.2013, 10:04     Класс Стек Stack. не работает класс исключений #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-корректность же. Нехорошо изменять исключение по пути.
Yandex
Объявления
26.02.2013, 10:04     Класс Стек Stack. не работает класс исключений
Ответ Создать тему
Опции темы

Текущее время: 15:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru