我无法通过运算符重载连接两个字符串。代码如下。
#include<iostream>
#include<string.h>
using namespace std;
class String
{
char *len;
public:
String(char *s);
void display();
String(){}
void setData(char *s);
//String(String &x);
~String();
String operator+(String);
void extend(int l);
};
void String::extend(int f)
{
len=(char *)realloc(len,(f+1)*sizeof(char));
}
String String::operator+(String x)
{
String t;
printf("%s\n",len);
t.setData(len);
t.extend(strlen(len)+strlen(x.len));
strcat(t.len,x.len);
printf("%s\n",t.len);
return (t);
}
String::~String()
{
delete len;
}
void String::setData(char *s)
{
len=(char *)calloc(strlen(s)+1,sizeof(char));
strcpy(len,s);
}
String::String(char *s)
{
len=(char *)calloc(strlen(s)+1,sizeof(char));
strcpy(len,s);
}
void String::display()
{
printf("%s\n",len);
}
int main()
{
String a=String("United ");
String b,c;
b.setData("States");
c=a+b;
c.display();
system("pause");
return 0;
}
问题是字符串是在运算符重载函数中连接的,但是当返回对象并且调用display函数时,输出就是垃圾值。
答案 0 :(得分:4)
您的代码未遵循Rule Of Three。您应该手动重载copy-constructor和赋值运算符。
此外,您 SHOULN'T 在delete
/ malloc
/ calloc
分配的缓冲区上使用realloc
,使用free
代替。
答案 1 :(得分:2)
使用
<string>
这是c ++库代替
<string.h>
这是一个c库。
答案 2 :(得分:0)
能够弄清楚出了什么问题,析构函数的定义就像一个bugaboo。一旦运算符函数超出范围,就会调用析构函数并销毁对象。
答案 3 :(得分:0)
此代码在这里应该可以正常工作。我知道它迟到了,但仍然。
#include<iostream.h>
#include<conio.h>
#include<string.h>
class String
{
char x[40];
public:
String() { } // Default Constructor
String( char s[] )
{
strcpy(x,s);
}
String( String & s )
{
strcpy(x,s.x );
}
String operator + ( String s2 )
{
String res;
strcpy( res.x,x );
strcat( res.x,s2.x);
return(res);
}
friend ostream & operator << ( ostream & x,String & s );
};
ostream & operator << ( ostream & x,String & s )
{
x<<s.x;
return(x);
}
int main()
{
clrscr();
String s1="Vtu";
String s2="Belgaum";
String s3 = s1+ s2;
cout<<"\n\ns1 = "<<s1;
cout<<"\n\ns2 = "<<s2;
cout<<"\n\ns1 + s2 = "<<s3;
getch();
return 0;
}