| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 990 人关注过本帖
标题:[求助]关于字符串问题
只看楼主 加入收藏
没牙的狼
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2006-4-23
收藏
 问题点数:0 回复次数:17 
[求助]关于字符串问题
问题:用运算符的重载将两个字符串加在一起.
#include<iostream.h>
#include<string.h>
class verb
{private:
int leng;
char *str;
public:
verb()
{strcpy(str,"no");
leng=0;
}
verb(char *i)
{leng=strlen(i);
str=new char[leng+1];
strcpy(str,i);
}
~verb()
{delete str;}

verb operator+(const verb &a)
{verb t;
t.leng=leng+a.leng;
t.str=new char[t.leng+1];
strcpy(t.str,str);
strcat(t.str,a.str);
return t.str;
}
void show()
{cout<<str;}
};
void main()
{verb a("sfsdf"),b("dsf"),c;
c=a+b;
c.show();
}

本程序无错误,可运行却什么也没有,希望高手们指点一下,谢谢
搜索更多相关主题的帖子: 字符 
2006-05-16 21:56
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
这里有几个错误,你的默认构造函数没有分配空间给你的指针!
析够函数应该是delete[]str;释放的是指向字符数组指针;还有,你的c=a+b;有两个错误:一、重载的+返回错误;二、没有重载=运算符,虽然=是默认运算符,无指针情况下可以直接使用,但是这里有指针参与,所以会出错。

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-16 22:54
没牙的狼
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2006-4-23
收藏
得分:0 
//二、没有重载=运算符,虽然=是默认运算符,无指针情况下可以直接使用,但是这里有指针参与,所以会出错。
没明白这句话,能帮改一下程序吗?谢谢

2006-05-17 15:22
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

呵呵,虽然知道错误在哪,帮你改了下,但是我发现,我的也运行不过去,也有点问题,兄弟们帮帮忙,没看出我的错误,帮忙指出一下:
#include<iostream>
#include<cstring>
using namespace std;
class verb
{
int leng;
char *str;
public:
verb():leng(0),str(NULL){}
verb(char *i)
{
leng=strlen(i);
str=new char[leng+1];
strcpy(str,i);
}
~verb(){delete [] str;}
verb & operator+(const verb &a)
{
verb t;
t.leng=leng+a.leng;
t.str=new char[t.leng+1];
strcpy(t.str,str);
strcat(t.str,a.str);
return t;
}
verb operator=(const verb &a)
{
leng=a.leng;
delete []str;
str=new char[leng+1];
strcpy(str,a.str);
return *this;
}
void show(){cout<<str;}
};
int main()
{
verb a("sfsdf"),b("dsf");
verb c;
c=a+b;
c.show();
system("pause");
return 0;
}


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-17 18:04
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
当然没有值啦,重载的方法operator+中,当operator+方法运行完之后会把t返回后释放,你用verb & operator+(const verb &a)方式返回当然连根毛都不剩了,另外必须支持相同对象的拷贝,否则返回之后只会有leng的值,而str指向的空间已经释放了,修改wfpb的如下,测试通过:
[CODE]#include<iostream>
#include<cstring>
using namespace std;
class verb
{
int leng;
char *str;
public:
verb():leng(0),str(NULL){}
verb(verb &v)
{
leng = v.leng;
str = new char[leng + 1];
strcpy(str, v.str);
}
verb(char *i)
{
leng=strlen(i);
str=new char[leng+1];
strcpy(str,i);
}
~verb(){delete [] str;}
verb operator+(const verb &a)
{
verb t;
t.leng=leng+a.leng;
t.str=new char[t.leng+1];
strcpy(t.str,str);
strcat(t.str,a.str);
return t;
}
verb& operator=(const verb &a)
{
leng=a.leng;
delete []str;
str=new char[leng+1];
strcpy(str,a.str);
return *this;
}
void show(){cout<<str;}
};
int main()
{
verb a("sfsdf"),b("dsf");
verb c;
c=a+b;
c.show();
system("pause");
return 0;
}[/CODE]

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-05-17 19:06
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
第2个函数是什么函数啊?

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-17 19:35
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
还有,你在代码前面加了什么东西啊?怎么和原文的格式一样?

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-17 19:36
没牙的狼
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2006-4-23
收藏
得分:0 
谢谢aogun,虽然我还不太明白.

2006-05-17 21:19
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
这个论坛怎么实现代码不移位啊?

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-17 21:31
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
我加的那个函数是拷贝构造函数,为什么加呢,解释起来比较麻烦,这样说吧,verb operator+(const verb &a)中的t是局部变量,在该方法执行完了之后会被清除,自然t中的指针str也会被释放,但是在执行完operator+之前,t被return给了operator+的返回值,即使说operator+返回的verb类型变量中的值和t中的一样(在没有拷贝构造函数之前),但是t中的str指针会被释放,那么返回值中的str指针指向的内存就是已经被释放的内存,那么值就未必是正确的了,你可以试试把拷贝构造函数去掉,那么operator=方法中a中的leng是对的,但是str指向的内存已经是错误的值了,所以需要拷贝构造函数。
[QUOTE]还有,你在代码前面加了什么东西啊?怎么和原文的格式一样?[/QUOTE]
没加什么,一般情况下正规的程序代码是不会以tab健来做缩进的,因为tab健的长短在不同的环境下会有不同的表现,所以正规代码中的tab健都会换成空格,那么不管什么情况代码的缩进都会有保证
,回得好辛苦

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-05-18 09:10
快速回复:[求助]关于字符串问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021624 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved