2012-01-22 84 views
2

我爲我的類製作了一個模板來模擬堆棧的基本功能,並且出現錯誤,我不知道如何解決該問題。C++堆棧模板

我的代碼:

#using <mscorlib.dll> 
using namespace System; 
using namespace System::IO; 

#include <iostream> 
#include <vector> 
using namespace std; 

template<class T> 
class stack 
{ 
    vector<T> *v; 
    int n; 
public: 
    stack(int,vector<T>*); 
    ~stack(); 

    void push(T); 
    void pop(); 

    void afis(); 
}; 

template<class T> 
stack<T>::stack(int x, vector<T> *y) 
{ 
    x = n; 
    y = v; 
} 

template<class T> 
stack<T>::~stack() 
{ 
} 

template<class T> 
void stack<T>::push(T item) 
{ 
    v->push_back(item); 
} 

template<class T> 
void stack<T>::pop() 
{ 
    v->pop_back(); 
} 

template<class T> 
void stack<T>::afis() 
{ 
    typedef vector<T>::iterator it; 
    for(it i = v->begin(); i != v->end(); ++i) 
     cout << *i << " "; 
} 

int main() 
{ 
    int n, nr; 
    cin >> n; 

    vector<int> v; 
    for(int i = 0; i < n; i++) 
    { 
     cin >> nr; 
     v.push_back(nr); 
    } 

    stack<int> st(n, &v); 

    st.pop(); 
    st.afis(); 
} 

,誤差在運行時,它說,它訪問內存,它不應該。 另外我想知道如果我可以通過一個指針,像stack * st = new stack(n,&v)來聲明我的堆棧。這是可行的嗎?

+0

它不是標準C++。它是專門爲CLR設計的微軟語言CLI/C++。 – Nawaz

+0

@Nawaz忽略第一行。它與代碼沒有任何關係 – Dementor

+0

你的構造函數看起來倒退了......應該是'v = y'和'n = x',而不是它寫的...... – spatz

回答

3

你的構造函數是所有向後:

template<class T> 
stack<T>::stack(int x, vector<T> *y) 
{ 
    n = x; 
    v = y; 
} 
+0

我多麼愚蠢^^ thx!另一個問題呢?聲明堆棧 * st =新堆棧(n,&v)? – Dementor

+0

@Dementor:當然,爲什麼不呢。我沒有看到這個問題。但是,將自動變量(即您的矢量)傳遞給動態對象是最危險的。 – bitmask

1

你的任務是倒退這裏。

template<class T> 
stack<T>::stack(int x, vector<T> *y) 
{ 
    x = n; 
    y = v; 
} 

nv永遠不會分配到任何東西。它們的值是不確定的。

通過使用初始化列表,可以在編譯時提醒您這些錯誤。

template<class T> 
stack<T>::stack(int x, vector<T> *y) 
    : n(x), v(y) 
{ 
} 
+0

你能解釋我:「n(x),v(y)」是如何工作的嗎? – Dementor

+2

@Dementor,請參閱[這裏](https://en.wikipedia.org/wiki/Initialization_%28programming%29#Initializer_list)。 – spatz

+0

這是推薦用於初始化'class'成員變量的語法,將'x'分配給'n',將'v'分配給'y'。 –

0

你在構造函數中的賦值語句是向後的。

0

只是爲了舉例來說,假設我們有一個這樣的類(差這個類之間,而你是我刪除n變量,我沒有指針矢量v

template<class T> 
class stack 
{ 
    vector<T> v; 
public: 
    stack(int,vector<T>*); 
    ~stack(); 

    void push(T); 
    void pop(); 

    void afis(); 
}; 

如果你沒有嘗試指針變量v,那麼你必須使用構造函數初始化列表作爲位掩碼告訴你。如果你不寫構造函數初始化列表,那麼你會得到編譯錯誤。這是因爲vector類具有它自己的構造函數,它必須在類構造函數的主體之前執行,並且只有地方是構造函數初始化列表。所以它會是這樣的:

template<class T> 
stack<T>::stack():v(0) 
{ 
} 

這意味着您創建了具有0個元素的向量。

我認爲如果你嘗試在main之外的其他函數中使用它,你的類就不會工作得很好,但是不要介意!