Шаблон стека C ++ - PullRequest
       1

Шаблон стека C ++

2 голосов
/ 22 января 2012

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

Мой код:

#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). Это возможно?

Ответы [ 4 ]

3 голосов
/ 22 января 2012

Ваш конструктор все назад:

template<class T> 
stack<T>::stack(int x, vector<T> *y)
{
    n = x;
    v = y;
}
1 голос
/ 22 января 2012

Ваши задания здесь задом наперед.

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 голосов
/ 23 января 2012

Например, допустим, у нас есть такой класс (разница между этим классом и вашим - в том, что я удалил переменную 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 элементами.

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

0 голосов
/ 22 января 2012

Вы операторы присваивания в конструкторе являются обратными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...