2013-10-23 78 views
0

我想寫我自己的堆棧的版本,這是我有:C++模板實例指針零誤差

template<class myStackType> class myStackClass 
{ 
    myStackType array[1000]; 
    int size; 
public: 
    myStackClass() 
    { 
     size = 0; 
    } 
    void pop() 
    { 
     size--; 
    } 
    void push(myStackType a) 
    { 
     array[size] = a; 
     size++; 
    } 
    myStackType top() 
    { 
     return array[size-1]; 
    } 
    bool empty() 
    { 
     return(size == 0); 
    } 
}; 

,但是當我嘗試實際使用它

struct grade 
{  
    int mid; 
    int final; 
    string name; 
    grade(int mid1 = 0, int final1 = 0, string name1 = 0) 
    { 
     mid = mid1; 
     final = final1; 
     name = name1; 
    } 
}; 

myStackClass<grade> myStack; 

我得到一個調試斷言失敗:無效空指針

另一方面,std ::堆棧在相同數據類型的同一個地方工作得很好

我做錯了什麼?

謝謝!

+0

如果我沒有錯,隨着用戶插入越來越多,堆棧增長。你爲什麼讓它有最多1000個元素? – Davlog

回答

2

這是錯誤的:

string name1 = 0 

它試圖從const char*0構建string - 這是不允許的。你可能意思是:

string name1 = "" 
1

您正在給構造函數中的字符串賦0。這是錯誤。編譯器試圖將0解釋爲char *,i。即一個C風格的字符串。但由於它是0,它被解釋爲一個NULL指針。

您可能還想做一些錯誤檢查以確保您的堆棧不會溢出,或者您不試圖從一個空堆棧彈出。

+0

就是這樣,謝謝 - 雖然現在我很困惑,爲什麼它使用std :: stack而不是我的..哦,謝謝 – user2813274

+0

這取決於堆棧類如何分配其存儲。如果std :: stack使用T *,它不需要在其構造函數中實際分配任何T。你正在使用一個數組,所以如果我沒有記錯的話,存儲中的每個元素都將被初始化,T()將被調用,並且,是的,那麼string = nullptr將會發生,崩潰隨之而來 –