2017-10-15 3 views
2

私はセグメンテーションフォルトが発生しているのですが、その理由はわかりません。テンプレートにはかなり新しく、物事を把握しようとするのが面倒です。私はテンプレートを使ってスタックを構築し、これまでメンバー関数pushとtop/peekのみを組み込んでいました。文字列スタックを作成しようとしています。テンプレートスタックが押し込まれていませんか?

#include <iostream> 
#include <string> 

template <class T> 
class TemplateStack { 
public: 
    typedef T type; 

    TemplateStack()//Default Constructor taking no parameters 
    { 
     max_size_ = 50; 
     TopOfStack = 0; 
    } 

    void push(T element) 
    { 
     if (TopOfStack == max_size_) 
      throw string("Stack's underlying storage is overflow"); 
     TopOfStack++; 
     data_[TopOfStack] = element; 
    } 

     T top() { 
      if (TopOfStack == -1) 
        throw string("Stack is empty"); 
      return data_[TopOfStack]; 
     } 

private: 
    size_t TopOfStack; //Generic data type for the top element of stack 
    size_t max_size_; 
    T* data_; 
}; 



int Main(){ 
    TemplateStack <string> T; 
    T.push("Hello"); 
    T.push("World!"); 
    std::cout<<T.top()<<std::endl; 
    return 0; 
}; 
+1

を書くことができ、あなたを編集してくださいセグメンテーションフォルトを引き起こしているステートメントを示すポスト。デバッガがこの十字軍の助けになります。 –

+0

要素を挿入した後に 'TopOfStack' *をインクリメントする必要があります。インデックス値0は、有効なインデックス(最初の要素)です。 –

答えて

4

あなたは、コンストラクタので

TemplateStack()//Default Constructor taking no parameters 
{ 
    max_size_ = 50; 
    TopOfStack = 0; 
} 

未定義の動作でポインタの結果を使用してスタックを持つ任意の操作でデータメンバ

T* data_; 

用のメモリを割り当てることができませんでした。

他のメソッドの実装によるデータメンバTopOfStackの初期値は-1とする。

は、私はあなたが割り当てられたメモリを解放するデストラクタを記述することも必要がある場合には、少なくとも

TemplateStack()//Default Constructor taking no parameters 
{ 
    max_size_ = 50; 
    TopOfStack = -1; 
    data_ = new T[max_size]; 
} 

を意味すると思います。

そしてメソッドプッシュが

void push(T element) 
{ 
    if (TopOfStack + 1 == max_size_) 
     throw string("Stack's underlying storage is overflow"); 
    TopOfStack++; 
    data_[TopOfStack] = element; 
} 

またはデータメンバーとして別の条件をチェックしなければならないTopOfStackはタイプsize_tを持って、あなたは

TemplateStack()//Default Constructor taking no parameters 
{ 
    max_size_ = 50; 
    TopOfStack = 0; 
    data_ = new T[max_size]; 
} 

void push(T element) 
{ 
    if (TopOfStack == max_size_) 
     throw string("Stack's underlying storage is overflow"); 
    data_[TopOfStack++] = element; 
} 

T top() { 
     if (TopOfStack == 0) 
       throw string("Stack is empty"); 
     return data_[TopOfStack -1]; 
    } 
+0

それはそれをしました!ありがとう! – cparks10

関連する問題