2016-10-16 16 views
0

私はC++でデータ構造とアルゴリズムを実行していますが、現在問題が発生しています。 私は配列を使ってスタッククラスを書いていますが、この本では関数宣言で例外指定を使用するように勧めています。私の場合は、RuntimeExceptionクラスから派生したStackEmptyExceptionクラスとStackFullExceptionクラスがあり、関数本体でこの例外を捕まえるべきではないと言われますが、プログラムを実行して例外を強制実行しようとすると、 。私は問題がどこから来ているのか理解したいと思っています。なぜなら、この本は本当に説明しているわけではなく、言及するだけなので、私は関連する答えに感謝します。ここに私のコードは次のとおりです。クラス内の例外処理C++

class RuntimeException { 
private: 
    string errMsg; 
public: 
    RuntimeException(const string& err) { errMsg = err; } 
    string getMessage() const { return errMsg; } 
}; 

inline ostream& operator<<(ostream& out, const RuntimeException& e){ 
    return out << e.getMessage(); 
} 

class StackEmptyException : public RuntimeException { 
public: 
    StackEmptyException(const string& err) : RuntimeException(err) {} 
}; 

class StackFullException : public RuntimeException { 
public: 
    StackFullException(const string& err) : RuntimeException(err) {} 
}; 

template <typename Object> 
class ArrayStack { 
private: 
    enum { CAPACITY = 1000 }; 
    int capacity; 
    Object* S; 
    int t; 

public: 
    ArrayStack(int cap = CAPACITY) { 
     capacity = cap; 
     S = new Object[capacity]; 
     t = -1; 
    } 

    int size() const { return t + 1; } 
    bool isEmpty() const { return (t < 0); } 

    // Passing the object by reference so that we could 
    // edit its value e.g. stack.top() = 10; would be valid 
    Object& top() throw(StackEmptyException) { 
     if (isEmpty()) 
      throw StackEmptyException("Access to empty stack"); 
     return S[t]; 
    } 

    void push(const Object& elem) throw(StackFullException) { 
     if (size() == capacity) 
      throw StackFullException("Stack overflow"); 
     S[++t] = elem; 
    } 

    // Not passing by reference, because we remove the last element 
    // from the stack, thus we can not change its value 
    Object pop() throw(StackEmptyException) { 
     if (isEmpty()) 
      throw StackEmptyException("Access to empty stack"); 
     return S[t--]; 
    } 

    ArrayStack(const ArrayStack& st);    // Copy constructor 
    ArrayStack& operator=(const ArrayStack& st); // Assignment operator constructor 
    ~ArrayStack() { delete[] S; }     // Destructor 

}; 
+0

このクラスはどのように使用していますか?例外をキャッチしようとしているのはどこですか? – UnholySheep

+0

main関数でいくつかのシナリオを試してみましたが、例外を強制しようとするまで、例えばstack.pop()で始めるなど、すべてうまくいきます。ちょうど宣言されたスタック上にある。 –

+0

'try' - ' catch'ブロックで例外を投げる可能性がある関数に呼び出しをラップしないと、例外は処理されません。もし本が何を正しく理解していれば(実際の本を読んでいない、あなたのステートメントを読んでいる)、 'try'の' ArrayStack'クラスのメンバ関数にコールをラップするか、 'catch'またはプログラム全体(正確に例外がどこで発生するのかを理解するのが難しくなるため、実際にはベストプラクティスではありません) – UnholySheep

答えて

0

私はあなたが最初に自分で境界チェックを行う必要がありますので、あなたの本はあなたが常にこれをキャッチするのtry/catchを使用してはならないと言う理由があると思います。ですから、pop()の前に、例えばisEmpty()が最初にチェックされていなければなりません。