2012-01-22 2 views
2

Я создал шаблон для моего класса, чтобы эмулировать основные функции стека, и я получаю сообщение об ошибке, и я не знаю, как его исправить.C++ stack template

Мой код:

#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(); 
} 

И ошибка во время выполнения, и он говорит, что доступ к памяти, что он не должен. Также мне интересно, могу ли я объявить свой стек через указатель что-то вроде стека * st = new stack (n, & v). Это возможно?

+0

Это не стандарт C++. Это CLI/C++, который является языком Microsoft, специально разработанным для CLR. – Nawaz

+0

@ Наваз игнорирует первую строку. он не имеет ничего общего с кодом – 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; 
} 

n и v никогда не получить назначения ни к чему. Их значения не определены.

Вы можете получить предупреждение об этих ошибках во время компиляции, используя списки инициализации.

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

Это рекомендуемый синтаксис для инициализации переменных-членов класса, присваивания 'x'' '' '' '' '' '' '' '' '. –

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, тогда вы должны использовать список инициализации конструктора, как сказал вам битмаск. Если вы не записываете список инициализации конструктора, вы получите ошибку компиляции. Это связано с тем, что у векторного класса есть собственный конструктор, который должен быть выполнен перед телом конструктора класса stack, и только место - это список инициализации конструктора. Так оно и было бы:

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

который означает, что вы создали вектор с 0 элементами.

Я думаю, что ваш класс не будет работать так хорошо, если вы попытаетесь использовать его в какой-то другой функции, чем основной, но неважно, что!