关于类和模板 不知道这个错误怎么改!(急,麻烦各位看看)

ftkghost 2004-10-06 10:13:17
这是仿造书中例子写的头文件:
#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
//
//程序中还在注释中有几个小问题,麻烦高手解答,不胜感激。

...全文
96 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ftkghost 2004-10-06
  • 打赏
  • 举报
回复
哈哈 好了
谢谢UPCC(杂食动物)、oo(为了名副其实,努力学习oo技术ing)
ftkghost 2004-10-06
  • 打赏
  • 举报
回复
好的 我试试
oo 2004-10-06
  • 打赏
  • 举报
回复
char* str;
std::cout<<"Enter a string : ";
std::cin>>*str;
没有申请内存:char *str = new char[256];//or other size


sizeof(str)应该是 strlen(str)才对。
Dong 2004-10-06
  • 打赏
  • 举报
回复
主要是:
char* str;
str = new char[100];///
你定义指针后没有分配空间啊。你没有空间又对它操作肯定错误的,你看好了没有。也是没有的话再把错误报上来
ftkghost 2004-10-06
  • 打赏
  • 举报
回复
Help!

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧