c ++:使用throw,try和catch

时间:2011-10-21 21:26:36

标签: c++ stack

我只是想扔掉,试着抓住工作。 这是我的堆栈的头文件,我把我的抛出“/ * * /”暂时忽略它。 http://codepad.org/0Pm2Hy6u

当我弹出并推送时,如果它是满的则抛出错误或异常时为空。我对这些都很陌生。

在我的书中,它将FullStack和EmptyStack设置为...... Class FullStack {}; (所以空类)和EmptyStack一样。

有人可能会帮我解决这个问题。

这是一个简单的主要内容:http://codepad.org/dbk4Ke6C

我怎样才能尝试并抓住工作。 ex)当调用stack.Push(item)并且它已满时我可以捕获错误并显示它

1 个答案:

答案 0 :(得分:3)

这里修复了一个版本作为单个文件:

在此处观看: https://ideone.com/95gMc

简而言之:

  • 您需要先定义exeption类,然后再抛出它们。将它们包含在StackType
  • 的头文件中
  • 在头文件中执行 NOT 使用(全局)using namespace!对于试图避免命名空间之间冲突的类用户来说,你会感到痛苦。
  • 你需要再将1个值压入堆栈

我最小化了评论,因为引用内联有点冗长(评论应该是它们的重量,IMO)

我可以建议:

  • 派生自一个公共堆栈异常基类(也建议一个更加一致的异常类命名约定): 编辑稍微解决了这个问题。对于理由,see this background article

     #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;
    }
}