关于类和模板 不知道这个错误怎么改!(急,麻烦各位看看)
这是仿造书中例子写的头文件:
#include"iostream"
#include"assert.h"
template<class T>
class Stack; //前向引用
//面向对象的约定:保持数据成员私有,保持接口成员函数公用。
template<class T>
class StackNode{
T data;
StackNode<T> *next;
StackNode(T d=0,StackNode<T> *link=NULL):data(d),next(link) //构造函数(对外接口)
{std::cout<<"StackNode"<<std::endl;}
//~StackNode();
friend class Stack<T>; //声明友元
};
template<class T>
class Stack{
StackNode<T> *top; //栈顶指针
public:
Stack():top(NULL) //构造函数在栈初始化时将top置为NULL.
{}
~Stack();
bool stack_IsEmpty() const //?? const为什么放在IsEmpty()后面,是不是这样声明
{ //以后,函数就不能改变对象的私有成员的值?
if(top==NULL)
return true;
else
return false;
}
void stack_Push(const T &d); //成员函数不需要把top作为形参传递到函数中.
T stack_Pop(); //弹出栈定结点
T stack_GetTop(); //取栈顶数据
void stack_MakeEmpty(); //置空栈
};
template<class T>
Stack<T>::~Stack() //为什么在Stack后面还要加上<T>?
{
StackNode<T> *tp; //定义实例时,StackNode的构造函数初始化类成员tp->data=0,tp->next=NULL
while(top!=NULL){
tp=top;
top=top->next;
delete tp;
}
}
//
//
//
//
//
template<class T>
void Stack<T>::stack_Push(const T &d) //为什么要引用d?
{
//初始化一个栈结点,并令node->next=top,node->data=d;
//由于node是一个StackNode的指针,在申请空间的同时要给类的成员赋值,
//因此在new后面用StackNode<T>(d,top)声明空间大小,并调用class StackNode的构造函数
std::cout<<"Push"<<std::endl;
StackNode<T> *node;
node=new StackNode<T>;
node->next=top;
top=node;
top->data=d;
std::cout<<"Push"<<std::endl;
}
template<class T>
T Stack<T>::stack_Pop()
{
assert(!stack_IsEmpty()); //断言:若栈不为空继续下面语句.
StackNode<T> *temp;
T getdata=top->data;
temp=top;
top=top->next;
delete temp;
return getdata;
}
template<class T>
T Stack<T>::stack_GetTop()
{
assert(!stack_IsEmpty());
return top->data;
}
template<class T>
void Stack<T>::stack_MakeEmpty()
{
StackNode<T> *tp;
while(top!=NULL){
tp=top;
top=top->next;
delete tp;
}
}
这是stack.cpp
用来试验头文件中STACK类的功能,
#include"iostream"
#include"STACKT.h" //自定义头文件
#include"conio.h"
bool symmetry(char* str);
int main()
{
char* str;
std::cout<<"Enter a string : ";
std::cin>>*str;
if(symmetry(str))
std::cout<<"The string is symmetry !"<<std::endl;
else
std::cout<<"The string is not symmetry !"<<std::endl;
return 0;
}
bool symmetry(char* str)
{
Stack<char> s_char; //定义栈对象 指定对象类型(char)
int i;
if(sizeof(str)%2==0){
for(i=0;i<sizeof(str)/2;i++)
s_char.stack_Push(str[i]);
for(i=sizeof(str)/2-1;i<sizeof(str)-1;i++)
if(s_char.stack_Pop()!=str[i]) return false;
}
else{
for(i=0;i<sizeof(str)/2;i++)
s_char.stack_Push(str[i]);
for(i=sizeof(str)/2;i<sizeof(str)-1;i++)
if(s_char.stack_Pop()!=str[i]) return false;
}
return true;
}
//编译通过,在运行的时候出错
//头文件中一些控制台输出的语句是我用来测试用的,
//错误在这一个函数中 void Stack<T>::stack_Push(const T &d)
//第二个Push没有输出就出错了 我用的编译器是VC6
//
//程序中还在注释中有几个小问题,麻烦高手解答,不胜感激。