2017-10-15 96 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