2
#include <iostream>
#include <vector>

typedef std::vector<int> vector_int;
//My pop exception class!
class cPopOnEnpty{};
//My push exception class!
class cPushOnFull{};

class cStack
{
private:
    vector_int v;
    int m_top, m_cap;
public:
    cStack(int capacity):m_top(0),m_cap(capacity){}
    void pop()
    {
        if(m_top==0)
            throw cPopOnEnpty();
        v.erase(v.begin()+m_top);
        m_top--;
    }
    void push(int const& i)
    {
        if(m_top==m_cap)
            throw cPushOnFull();
        v.push_back(i); m_top++;
    }
};

int main(int argc, char **argv)
{
    cStack c(3);
    try {
        c.pop(); //m_top = 0 So exception should be thrown!
        c.push(2); //m_top = 1
        c.push(10); //m_top =2
        c.push(3);  //m_top =3
        c.push(19); //m_top = 4 Exception should be thrown here!
    }
    catch (cPopOnEnpty&)
    {
        std::cerr<< "Caught: Stack empty!"<<std::endl;
    }
    catch(cPushOnFull&)
    {
        std::cerr<<"Caught: Stack full!"<<std::endl;
    }
    return 0;
}

O/P - キャッチ: スタックが空です!

必要な O/P - キャッチ: スタックが空です! キャッチ: スタックがいっぱい!

上記のコードでは、空のベクターのポップとフル (容量は私によって制限されています) ベクターのプッシュを処理しています。これらのケースでは、コントロールがメインの終わりに達してプログラムが終了するため、目的の o/p が得られません。ある呼び出しの例外を処理した後、次の呼び出しに進むように、これを再開するにはどうすればよいですか?

ここで、その後の次のステートメントをc.pop()実行する必要があります。助けが必要!

4

3 に答える 3

2

メソッド呼び出しごとにTry/Catchブロックを記述します。

try
{
    c.pop(); //m_top = 0 So exception should be thrown!
}
catch(cPopOnEnpty&)
{
    std::cerr<< "Caught: Stack empty!"<<std::endl;
}
于 2013-02-20T18:22:11.193 に答える
0

C++ では、スタックが既に巻き戻されているため、例外の後に再開することはできません (たとえば、まったく異なる獣である Lisp の条件とは異なります)。

@RobertHarveyが提案したように、コードを別の方法で構築する必要があります。

于 2013-02-20T18:27:44.703 に答える
0
try {
        c.pop(); //m_top = 0 So exception should be thrown!
    }
    catch (cPopOnEnpty&)
        {
            std::cerr<< "Caught: Stack empty!"<<std::endl;
        }
    try{
        c.push(2); //m_top = 1
        c.push(10); //m_top =2
        c.push(3);  //m_top =3
        c.push(19); //m_top = 4 Exception should be thrown here!
    }
    catch(cPushOnFull&)
    {
        std::cerr<<"Caught: Stack full!"<<std::endl;
    }

問題が解決しました!君たちありがとう!:D

于 2013-02-20T18:40:06.163 に答える