c ++: работа с throw, try и catch - PullRequest
1 голос
/ 22 октября 2011

Я просто пытаюсь бросить, попытаться поймать на работу. Вот мой заголовочный файл для моего стека, и я помещаю свой бросок в "/ * * /", чтобы игнорировать его на данный момент. http://codepad.org/0Pm2Hy6u

Это для случаев, когда я выдвигаю и нажимаю, поэтому выкидываю ошибку, если она заполнена или пуста, за исключением. Я новичок в этом.

В моей книге он устанавливает FullStack и EmptyStack следующим образом ... Class FullStack {}; (такой пустой класс) и то же самое для EmptyStack.

Может кто-нибудь, возможно, поможет мне понять это.

Вот простой основной: http://codepad.org/dbk4Ke6C

Как я могу попробовать и поймать на работу. ex) При вызове stack.Push (item), и он полон, я могу отловить ошибку и отобразить ее

1 Ответ

3 голосов
/ 22 октября 2011

Здесь исправлена ​​версия в виде отдельного файла:

Смотрите вживую здесь: https://ideone.com/95gMc

Короче:

  • вам нужноопределить классы исключений, прежде чем вы можете бросить их.Включите их в заголовочный файл для StackType
  • do НЕ use (global) using namespace в заголовочных файлах!Вы сделаете жизнь несчастной для пользователей вашего класса, которые пытаются избежать столкновений между пространствами имен
  • вам нужно было поместить еще 1 значение в стек

Я свернул комментарии, потому что это былонемного длиннее, чтобы заключить в кавычки (и комментарии должны тянуть их вес, IMO)

Могу ли я предложить:

  • происходят из базового класса исключений общего стека (также предлагаетболее согласованное соглашение об именах для исключительных классов): Edit несколько исправило это.Для обоснования, см. Эту справочную статью

     #include <stdexcept>
    
     struct StackException : virtual std::exception 
     {  
         protected: StackException() {}
     };
     struct StackFullException : StackException 
     {
         char const* what() const throw() { return "StackFullException"; }
     };
     struct StackEmptyException : StackException
     {
         char const* what() const throw() { return "StackEmptyException"; }
     };
    

    таким образом, вы всегда можете поймать любой StackException& (по ссылка ) и обрабатывать любой стек полностью/ пусто за один раз

  • , чтобы обработать исключение, используйте что-то вроде этого:

    int main()
    {
         try {
               // ....
         } catch (const StackException& e)
         {
             std::cerr << "oops, a stack error occured: " << e.what() << std::endl;
         }
    } 
    

Редактировать Пример, отредактированный для демонстрации расширенных типов исключений и примера обработчика:

//Purpose: Header file for StackType. Containing all declerations and prototypes
#include <stdexcept>

struct StackException : virtual std::exception 
{  
    protected: StackException() {}
};
struct StackFullException : StackException 
{
    char const* what() const throw() { return "StackFullException"; }
};
struct StackEmptyException : StackException
{
    char const* what() const throw() { return "StackEmptyException"; }
};


template <class itemType>
class StackType
{
public:
    StackType   (int max);
    StackType   ();
    bool IsEmpty() const;
    bool IsFull () const;
    void Push   (itemType newItem);
    void Pop    ();
    itemType Top() const;
    ~StackType  (); // Destructor

private:
    int top;        // key:top of the stack
    int maxStack;   // max number of stack items
    itemType* list; // pointer to dynamically allocated memory
};

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*Implementation (StackStype.cpp)
StackType prototype functions*/

template <class itemType>
StackType<itemType>::StackType(int max)
{
    maxStack = max;
    top = -1;
    list = new itemType[maxStack];
}

template <class itemType>
StackType<itemType>::StackType()
{
    maxStack = 200;
    top = -1;
    list = new itemType[maxStack];
}

template <class itemType>
bool StackType<itemType>::IsEmpty() const
{
    return(top == -1);
}

template <class itemType>
bool StackType<itemType>::IsFull() const
{
    return(top == maxStack - 1);
}

template <class itemType>
void StackType<itemType>::Push(itemType newItem)
{
    if(IsFull())
    {
        throw StackFullException();
    }
    top++;
    list[top] = newItem;
}

template <class itemType>
void StackType<itemType>::Pop()
{
    if(IsEmpty())
    {
        throw StackEmptyException();
    }
    top--;
}

template <class itemType>
itemType StackType<itemType>::Top() const
{
    if(IsEmpty())
    {
        throw StackEmptyException();
    }
    return list[top];
}

template <class itemType>
StackType<itemType>::~StackType()
{
    delete [] list;
}

///////////////////////////////////////
// sample main.cpp

#include <iostream>
int main(void)
{
    try
    {
        StackType<int> stack(5);
        stack.Push(5);
        stack.Push(2);
        stack.Push(3);
        stack.Push(4);
        stack.Push(1);//<-----Still Ok!
        stack.Push(0);//<-----throw FullStack
    } catch (const StackException& e)
    {
        std::cerr << "Received a StackException: what()? " << e.what() << std::endl;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...