stackaslist,again
//基类stack
#ifndef STACK_H
#defineSTACK_H
template<class T>
class stack
{
virtual ~stack()=0;
virtual const T&top()const=0;
virtual void push(const T&)=0;
virtual const T& pop()=0;
};
#endif
//
//派生类stackaslist
//stack的实现用list来完成。分别用stl中list和userdefine的list.
#include<iostream>
#include<list>
#include"stack.h"
using std::domain_error;
template<class T>
class stackaslist:public stack
{
public:
stackaslist();
~stackaslist();//用stl中的list应该没有必要再使用destructor了吧??????
void push(const T& obj);
const T& top();
const T& pop();
int getsize();
private:
int size;//最大的存储空间
int count;//已经存储数据的个数
std::list<T> li;
};
template<class T>
stackaslist<T>::stackaslist()//提示说基类stack没有可用的默认构造函数???????
{ //这个构造函数应该怎么写?
size=0;//0li.max_size; ;//应该多大?????????
count=0;
}
template<class T>
stackaslist<T>::~stackaslist()
{
}
template<class T>
int stackaslist<T>::getsize()
{
return size;
}
template<class T>
const T& stackaslist<T>::pop()
{
if(count==0)
throw domain_error("the stack is emputy");
const T temp= *li.end();
li.remove(temp);
cout<<"after pop() the size is"<<size<<endl;
returntemp;//return li.pop_back();
}
template<class T>
void stackaslist<T>::push(const T& obj)
{
if(count==size)
throw domain_error("the stack is full");
li.push_front(obj);
cout<<"now the size after push is"<<size<<endl;
}
template<class T>
const T& stackaslist<T>::top()
{
return *li.end();
}
//main.cpp#include<iostream>
#include<list>
#include"stack.h"
#include"stackaslist.h"
using std::cout;
using std::endl;
int main()
{
stackaslist<int> sta;
cout<<"now the size"<<sta.getsize()<<endl;;
for(int i=0;i<=6;i++)
{
sta.push(i);
}
cout<<sta.pop()<<endl;;
cout<<sta.getsize()<<endl;
cout<<sta.top()<<endl;
}
///问题在注释中,谢谢。