我为我的类创建了一个模板来模拟堆栈的基本功能,我收到错误,我不知道如何修复它。
我的代码:
#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,&amp; v)的指针来声明我的堆栈。那可能吗?
答案 0 :(得分:3)
你的构造函数都是倒退的:
template<class T>
stack<T>::stack(int x, vector<T> *y)
{
n = x;
v = y;
}
答案 1 :(得分: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)
{
}
答案 2 :(得分:0)
你在构造函数中的赋值语句是向后的。
答案 3 :(得分:0)
例如,假设我们有这样的类(这个类和你的类之间的区别在于我删除了n
变量而我没有指向vector v
)
template<class T>
class stack
{
vector<T> v;
public:
stack(int,vector<T>*);
~stack();
void push(T);
void pop();
void afis();
};
如果你尝试在变量v上没有指针,那么你必须使用构造函数初始化列表作为位掩码告诉你。如果你不编写构造函数初始化列表,那么你将得到编译错误。这是因为vector类有自己的构造函数,必须在stack
类构造函数的body之前执行,并且只有place是构造函数初始化列表。所以它会像:
template<class T>
stack<T>::stack():v(0)
{
}
表示您创建了带有0个元素的向量。
我认为如果你尝试在main之外的其他功能中使用它,那么你的课程不会那么好用,但不要小心!