string类,求救!

bouque 2003-04-11 02:59:20
我试着自己写了一个string类,编译后有一个错误:error C2533: 'QString::QString' : constructors not allowed a return type
很不明白为什么,请高手指教.
也请大家对这个类的各方面评价一下,多给一些建议.
/******************QString.h*************************************************************/////////////////////
#ifndef _QSTRING_H
#define _QSTRING_H
class QString
{
public:
////QString str;
////char *str="qiuzicheng";QString str(str);
////QString QStr;QString str(Q_str);
QString();
QString(char* );
QString(QString& );
///QString(int size);
/////////////////////////////////对象的三种初始化方式

~QString();//////////////析构对象

////////////////操作符重载
//////+,=,==,

//////Q_str1=Q_str2;
//////Q_str1="qiuzicheng";
QString& operator =(QString&);
QString& operator =(char *str);


//////Q_str1=Q_str2+Q_str3;
//////Q_str1=Q_str2+"qiuzicheng";
//////Q_str1="qiuzicheng"+Q_str2;
//////Q_str1="qiu"+"zicheng";
QString operator +(QString &);
QString operator +(char *str);
//friend QString operator +(char *str,QString &Q_str1);


//////Q_str1==Q_str2;
//////Q_str1=="qiuzicheng";
//////"qiuzicheng"==Q_str1;
bool operator ==(QString& Q_str2);
/// bool operator ==(QString& Q_str1,char* str1);
/// bool operator ==(char* str1,QString& Q_str1);

/////Q_str1[0]=Q_str2[1];
char operator [](int );

//////get functions group
int GetSize(){return Q_Size;}
char* GetCstring(){return Q_String;}
protected:
int Q_Size;
char *Q_String;

}



#endif////_QSTRING_H


////////////////////////////////////QString.cpp///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string.h>
using namespace std;
#include "QString.h"
QString::QString()
{
Q_String="QiuZichengString";
Q_Size=strlen(Q_String);

}

QString::QString(char* str)
{
if(str)
{
Q_String=new char[strlen(str)+1];
strcpy(Q_String,str);
Q_Size=strlen(str);
}
else
{
Q_Size=0;
Q_String=NULL;
}

}

/*QString::QString(int size)
{
if(size)
{
Q_Size=size;
Q_String=new char[size];
strcpy(Q_String,"empty");
}
else
{
cerr<<"Initializing Error!"<<endl;
}


}*/

QString::QString(QString& Q_str)
{

Q_Size=Q_str.Q_Size;
if(Q_str.Q_String)
{
Q_String=new char[Q_Size+1];
strcpy(Q_String,Q_str.Q_String);
}
else
{
Q_String=NULL;
}
}///////////构造函数

QString::~QString()
{
delete []Q_String;
}////////////////析构函数



//**********************************运算符重载***************************************************************************************************************/////////////////////
QString QString::operator +(QString &Q_str)
{
int Total_Size=this->Q_Size+Q_str.Q_Size;
char* str=new char[Total_Size+1];
strcpy(str,Q_str.Q_String);
strcat(str,this->Q_String);
QString Result(str);
return Result;
}

QString QString::operator +(char *str)
{
QString Des_str(str);
return ((*this)+Des_str);
}//////////operator +

QString& QString::operator =(char *str)
{
this->Q_Size=strlen(str);
delete []this->Q_String;
this->Q_String=new char[Q_Size+1];
strcpy(Q_String,str);
return *this;
}

QString& QString::operator =(QString& Q_str)
{

Q_Size=Q_str.Q_Size;
delete []Q_String;
Q_String=new char[Q_Size+1];
strcpy(Q_String,Q_str.Q_String);
return *this;
}/////operator =

bool QString::operator ==(QString& Q_str)
{
if(Q_Size!=Q_str.Q_Size)
if(!strcmp(Q_String,Q_str.Q_String))
return false;
else
cerr<<"class matching wrong!"<<endl;
else if(!strcmp(Q_String,Q_str.Q_String))
cerr<<"class matching wrong!"<<endl;
else
return true;
}

void main()
{
}


...全文
177 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
TopCat 2003-04-11
  • 打赏
  • 举报
回复
若是将operator +写成friend QString operator +(const QString &str, const QString &Q_str1); 的非成员函数,它可以处理 QString+char* 的情况吗?
--------------------
没有问题,它会隐式的调用QString::QString(char *)产生一个临时变量。当然会造成性能方面的问题了,所以我说,如果有必要,你可以重载几个operator+
bouque 2003-04-11
  • 打赏
  • 举报
回复
确实是少了分号(;).下面,我作了些修改.
若是将operator +写成friend QString operator +(const QString &str, const QString &Q_str1); 的非成员函数,它可以处理 QString+char* 的情况吗?
上面的QString()构造对象后,析构是会有运行错误的,所以作了修改.
大家多多发表意见,待会儿结贴.
/******************QString.h*************************************************************/////////////////////
#ifndef _QSTRING_H
#define _QSTRING_H

class QString;
ostream& operator <<(ostream&,QString&);

class QString
{
public:
////QString str;
////char *str="qiuzicheng";QString str(str);
////QString QStr;QString str(Q_str);
QString();
QString(char* );
QString(QString& );
/////////////////////////////////对象的三种初始化方式

~QString();//////////////析构对象

void print(ostream& out);

////////////////操作符重载
//////+,=,==,

//////Q_str1=Q_str2;
//////Q_str1="qiuzicheng";
QString& operator =(QString&);
QString& operator =(char *str);


//////Q_str1=Q_str2+Q_str3;
//////Q_str1=Q_str2+"qiuzicheng";
//////Q_str1="qiuzicheng"+Q_str2;
//////Q_str1="qiu"+"zicheng";
QString operator +(QString &);
QString operator +(char *str);
//friend QString operator +(char *str,QString &Q_str1);


//////Q_str1==Q_str2;
//////Q_str1=="qiuzicheng";
//////"qiuzicheng"==Q_str1;
bool operator ==(QString& Q_str2);
/// bool operator ==(QString& Q_str1,char* str1);
/// bool operator ==(char* str1,QString& Q_str1);

/////Q_str1[0]=Q_str2[1];
char operator [](int );

//////get functions group
int GetSize(){return Q_Size;}
char* GetCstring(){return Q_String;}
protected:
int Q_Size;
char *Q_String;

};



#endif////_QSTRING_H

////////////////////////////////////QString.cpp///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string.h>
using namespace std;
#include "QString.h"
QString::QString()
{
Q_String=new char[17];
strcpy(Q_String,"QiuZichengString");
Q_Size=strlen(Q_String);

}

QString::QString(char* str)
{
if(str)
{
Q_String=new char[strlen(str)+1];
strcpy(Q_String,str);
Q_Size=strlen(str);
}
else
{
Q_Size=0;
Q_String=NULL;
}

}

/*QString::QString(int size)
{
if(size)
{
Q_Size=size;
Q_String=new char[size];
strcpy(Q_String,"empty");
}
else
{
cerr<<"Initializing Error!"<<endl;
}


}*/

QString::QString(QString& Q_str)
{

Q_Size=Q_str.Q_Size;
if(Q_str.Q_String)
{
Q_String=new char[Q_Size+1];
strcpy(Q_String,Q_str.Q_String);
}
else
{
Q_String=NULL;
}
}///////////构造函数

QString::~QString()
{
delete []Q_String;
}////////////////析构函数

void QString::print(ostream& out)
{
out<<Q_String<<endl;
}

//**********************************运算符重载***************************************************************************************************************/////////////////////
QString QString::operator +(QString &Q_str)
{
int Total_Size=this->Q_Size+Q_str.Q_Size;
char* str=new char[Total_Size+1];
strcpy(str,this->Q_String);
strcat(str,Q_str.Q_String);
QString Result(str);
return Result;
}

QString QString::operator +(char *str)
{
QString Des_str(str);
return ((*this)+Des_str);
}//////////operator +

QString& QString::operator =(char *str)
{
this->Q_Size=strlen(str);
delete []this->Q_String;
this->Q_String=new char[Q_Size+1];
strcpy(Q_String,str);
return *this;
}

QString& QString::operator =(QString& Q_str)
{

Q_Size=Q_str.Q_Size;
delete []Q_String;
Q_String=new char[Q_Size+1];
strcpy(Q_String,Q_str.Q_String);
return *this;
}/////operator =

bool QString::operator ==(QString& Q_str)
{
if(this->Q_Size!=Q_str.Q_Size) return false;
return strcmp(Q_String,Q_str.Q_String)?false:true;
}///////////////////operator ==


ostream& operator<<(ostream& out,QString& Q_str)
{
Q_str.print(out);
return out;
}

void main()
{
QString Qstr1;
cout<<Qstr1<<endl;


QString Qstr2("is very good");
cout<<Qstr2<<endl;

QString Qstr3;
Qstr3=Qstr1+Qstr2;
cout<<"the addition operate:"<<Qstr3<<endl;

QString Qstr4(Qstr3);
QString Qstr5=Qstr3;
cout<<"the copy constructor is working: "<<Qstr4<<endl;
cout<<"the operator '=' is working: "<<Qstr5<<endl;

if(Qstr1==Qstr2)
cout<<"Qstr1==Qstr2"<<endl;
else
cout<<"Qstr1!=Qstr2"<<endl;
if(Qstr4==Qstr5)
{
cout<<"Qstr4==Qstr5"<<endl;
cout<<"the operator working correctly"<<endl;

}
else
{
cout<<"Qstr4!=Qstr5"<<endl;
cout<<"the operator working wrong"<<endl;
}

QString Qstr6=Qstr1+" is very good";
cout<<Qstr6;
cout<<"QString + char* working correctly"<<endl;

cout<<"press any key to contune......"<<endl;
int i;
cin>>i;
}
现在运行没有问题了,谢谢大家.

gladhong 2003-04-11
  • 打赏
  • 举报
回复
同意micopentium6
tiankong 2003-04-11
  • 打赏
  • 举报
回复
在QString.h的类定义{}后面少了分号(;),构造函数会被认为有返回类型出错
TopCat 2003-04-11
  • 打赏
  • 举报
回复
实现我没仔细看,把你的定义稍微修改了一下。主要是更加“符合用户习惯”一些。operator+也可以用重载进行优化,如果有必要的话。

你的错误是说构造不能返回值,具体原因我没时间查 :)
----------------------------------------------
class QString
{
public:
////QString str;
////char *str="qiuzicheng";QString str(str);
////QString QStr;QString str(Q_str);
QString();
QString(char* );
QString(const QString& );
/////////////////////////////////对象的三种初始化方式

~QString();//////////////析构对象

////////////////操作符重载
//////+,=,==,

//////Q_str1=Q_str2;
//////Q_str1="qiuzicheng";
QString& operator =(const QString&);
QString& operator =(char *str);


//////Q_str1=Q_str2+Q_str3;
//////Q_str1=Q_str2+"qiuzicheng";
//////Q_str1="qiuzicheng"+Q_str2;
//////Q_str1="qiu"+"zicheng";
// QString operator +(QString &);
// QString operator +(char *str);
friend QString operator +(const QString &str, const QString &Q_str1);


//////Q_str1==Q_str2;
//////Q_str1=="qiuzicheng";
//////"qiuzicheng"==Q_str1;
bool operator ==(QString& Q_str2) const;
/// bool operator ==(QString& Q_str1,char* str1);
/// bool operator ==(char* str1,QString& Q_str1);

/////Q_str1[0]=Q_str2[1];
char operator [](int ) const;

//////get functions group
int GetSize() const {return Q_Size;}
const char* GetCstring() const { return Q_String;}
protected:
int Q_Size;
char *Q_String;

}
  • 打赏
  • 举报
回复
#ifndef _QSTRING_H
#define _QSTRING_H
class QString
{
public:
////QString str;
////char *str="qiuzicheng";QString str(str);
////QString QStr;QString str(Q_str);
QString();
QString(char* );
QString(QString& );
///QString(int size);
/////////////////////////////////对象的三种初始化方式

~QString();//////////////析构对象

////////////////操作符重载
//////+,=,==,

//////Q_str1=Q_str2;
//////Q_str1="qiuzicheng";
QString& operator =(QString&);
QString& operator =(char *str);


//////Q_str1=Q_str2+Q_str3;
//////Q_str1=Q_str2+"qiuzicheng";
//////Q_str1="qiuzicheng"+Q_str2;
//////Q_str1="qiu"+"zicheng";
QString operator +(QString &);
QString operator +(char *str);
//friend QString operator +(char *str,QString &Q_str1);


//////Q_str1==Q_str2;
//////Q_str1=="qiuzicheng";
//////"qiuzicheng"==Q_str1;
bool operator ==(QString& Q_str2);
/// bool operator ==(QString& Q_str1,char* str1);
/// bool operator ==(char* str1,QString& Q_str1);

/////Q_str1[0]=Q_str2[1];
char operator [](int );

//////get functions group
int GetSize(){return Q_Size;}
char* GetCstring(){return Q_String;}
protected:
int Q_Size;
char *Q_String;

};//少了分号!

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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