运算符重载,用“+”连接两个字符串,报错~~

芒果仔 2010-05-08 12:16:45
#include<iostream>
#include<string>
using namespace std;

class Complex
{
public:
Complex() //默认构造函数
{
p=NULL;
}
Complex(char *str) //构造函数
{
p=str;
}
friend Complex operator+(Complex &s1,Complex &s2);
void display();

private:
char *p;
};

Complex operator + (Complex &s1,Complex &s2)
{
return strcat(s1.p,s2.p);
}
void Complex::display()
{
cout<<p<<endl;
}

int main()
{
Complex s1("Hello"),s2(" World!"),s3;

s3=s1+s2;
s3.display();

return 0;

}

...全文
216 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
暗黑帝国 2010-05-09
  • 打赏
  • 举报
回复
同意7楼

只是operator+的返回值和参数应该是const。否则(s1+s2)=s1;这样的语句也能通过,显然这样语法不符合常理。
ctwoz 2010-05-08
  • 打赏
  • 举报
回复
学习了…
brookmill 2010-05-08
  • 打赏
  • 举报
回复
报错的原因是:s1.p指向了一个常量字符串,然后试图用strcat去修改这个常量字符串,所以出错了。
其实这个只是小错误,而且很幸运通过这个小错误暴露了设计上的大问题。

没时间帮你改代码了。字符串类的代码在很多书上都有,网上也能找到很多,楼主自己看看吧。
arong1234 2010-05-08
  • 打赏
  • 举报
回复
几个问题:
1。有指针的类必须有拷贝构造函数和operator=,否则有指针悬挂
看看http://blog.vckbase.com/arong/archive/2010/03/05/301.html

2. 所有参数必须声明为const Complex&和const char*,你又不修改它,为什么是non-const?
3. 指针不能直接接收参数内的str,你需要分配内存!strcat前更需要重新分配内存,否则你怎么保证它存得下?
brookmill 2010-05-08
  • 打赏
  • 举报
回复
Complex(char *str) //....
{
p=str;
}
这个设计也不对。象这样简单地直接把p指向str是不行的,如果以后str有变化这个对象也会跟着变化。
应该给p分配空间,然后把str的内容复制过来。
brookmill 2010-05-08
  • 打赏
  • 举报
回复
这个strcat的思路是不对的,因为它修改了s1。
应该给s3重新创建一个字符串才对。
qq675927952 2010-05-08
  • 打赏
  • 举报
回复
up ls ,up lz
周靖峰 2010-05-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cattycat 的回复:]
C/C++ code
Complex operator + (Complex &s1,Complex &s2)
{
char* p=(char*)malloc(strlen(s1)+strlen(s2)+1);
strcpy(p,s1.p);
strcat(p,s2.p);
return Complex(p);
}
[/Quote]
这是一个问题
同时再将头文件改为
#include <iostream.h>
#include <string>
去掉using namespace std;
原因是VC6对C++标准不是100%的实现,因此有时会出现新头文件出错的问题
像iostream这个头文件就不是很好的支持友元函数

完整的代码是

#include <iostream.h>
#include <string>
//using namespace std;

class Complex
{
public:
Complex() //默认构造函数
{
p = NULL;
}
Complex(char *str) //构造函数
{
p = str;
}
friend Complex operator + (Complex &s1, Complex &s2);
void display();
private:
char *p;
};

Complex operator + (Complex &s1, Complex &s2)
{
char *p = (char *)malloc(strlen(s1.p) + strlen(s2.p) + 1);
strcpy(p, s1.p);
strcat(p, s2.p);
return Complex(p);
}

void Complex::display()
{
cout << p << endl;
}

int main()
{
Complex s1("Hello"), s2(" World!"), s3;

s3 = s1 + s2;
s3.display();

return 0;
}
cattycat 2010-05-08
  • 打赏
  • 举报
回复
Complex operator + (Complex &s1,Complex &s2)
{
char* p=(char*)malloc(strlen(s1)+strlen(s2)+1);
strcpy(p,s1.p);
strcat(p,s2.p);
return Complex(p);
}

得分配内存,这个只是临时改了下,内存释放的没加。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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