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

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
//
//程序中还在注释中有几个小问题,麻烦高手解答,不胜感激。

...全文
92 5 打赏 收藏 转发到动态 举报
写回复
用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!
简介: 工程自动获取和封装用户自定义参数以及数据库表信息,并通过模板配置文件将生成代码文件直接输出到应用工程目录下,达到从数据库表到页面增删查过程代码一键生成. 工程提供所有源码,包括第三方jar包也附带源码包 注意事项: 1.需要一定的java开发基础. 2.要有java开发的集成环境,本工程没有界面,很多功能都是通过直接注释,或增加一些代码完成. 3.JDK版本必须是1.6以上,否则会报版本错误.当然也可以更换工程依赖的jar,使用一些低版本的jar包 使用说明: 1. 修数据库连接参数:详见jdbc.properties 2. 修或增加数据库字段型与编译语言数据型映射:详见dm2java.properties 3. 修模板配置信息:详见vm.xml 4. 编写用户模板,参考/templates目录下的文件 5. 开启关闭/备份: 调用FileUtilsExt.backup(String[] fileList, String backupDir)方法 6. 还原备份: 调用FileUtilsExt.recover(String backupDir)方法. 7. 从数据库表合成文件: 调用PlayTemplates的main方法 8. 从EXCEL和成文件: 调用ExcelUtils的main方法 详细说明: 1.自动封装用户参数 参数配置文件params.properties有三参数: 1.1 以array.为前缀参数(可设定设定多个)且用逗号分隔,将封装成数组对象,可循环输出 例如: array.names=xixi, haha 模版调用: #foreach($item in $names) $item #end 输出:xixi haha 1.2 以single.为前缀的参数(可设定设定多个),可在模板中直接调用输出 例如: single.name=xixi 模版调用: $name 输出:xixi 1.3 无任何前缀的参数,为工程要强制使用的参数,必须填写 2. 封装数据库表参数,目前只支持达梦数据库(我们公司自个的数据库),其他数据库以后再完善 如果各位想用其他数据库,可以自己加载其他数据库的驱动,并修一下DbOption下的getTableColumns(String)方法中的查询表信息方法 以及添加似dm2java.properties数据库型到java数据型的映射文件,不同数据库的方言和数据映射太烦了. 当然,也可以联系我^_^ 自动从数据库中获取表名/表注释/列名/列注释/列型等等相关信息 示例:由角色表生成domain对象 模版: package $!{package}.domain; import java.util.Date; /** * $!system * @author $!author * @version $!version * @date $!dateTool.format('yyyy-MM-dd', ${date}) */ public class $!{tableAlias}{ #foreach($item in $columnList) private $!item.data_type $!item.column_name.toLowerCase(); // $!item.column_label #end #foreach($item in $columnList) #set($name = $!item.column_name.toLowerCase()) #set($upperName = $!{stringTool.firstUpperCase($name)}) public void set$!{upperName}($!item.data_type $name){ this.$name=$name; } public $

64,639

社区成员

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

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