作者zenixls2 (zenix)
看板C_and_CPP
标题[语法] String实做debug
时间Thu May 21 20:47:36 2009
//排的有点丑,请包涵
//DevC++编译不过
//其指出的错误已加在code内
#include<iostream>
#include<string.h>
using namespace std;
class String
{
protected:
char *str;
int length;
int capacity;
public:
String()
{
str=new char[100];
memset(str,0,sizeof(char)*100);
length=0,capacity=100;
}
String(const char *a)//fixed:plus "const"
{
length=strlen(a),capacity=100;
if(length>=capacity)
{
str=new char[length+1];
memset(str,0,sizeof(char)*(length+1));
capacity=length+1;
strcpy(str,a);
//for(int i=0;i<=length;i++)str[i]=a[i];
}
else
{
str=new char[100];
strcpy(str,a);
//for(int i=0;i<=length;i++)str[i]=a[i];
str[length]=0;
}
}
String(const String &a)//fixed:plus "const"
{
length=a.length;
capacity=100;
if(a.length>=capacity)
{
//delete str;
str=new char[length+1];
capacity=length+1;
memset(str,0,sizeof(char)*(length+1));
strcpy(str,a.str);
}
else
{
str=new char[100];
strcpy(str,a.str);
str[length]=0;
}
}
~String()
{
delete []str;
length=0;
capacity=0;
}
friend bool operator==(const String &a,const char *b)
{
return strcmp(a.str,b)==0;
}
friend bool operator==(const String &a,const String &b)
{
return strcmp(a.str,b.str)==0;
}
friend bool operator==(const char *a,const String &b)
{
return strcmp(a,b.str)==0;
}
friend bool operator!=(const String &a,const char *b)
{
return (!(a==b));
}
friend bool operator!=(const String &a,const String &b)
{
return (!(a==b));
}
friend bool operator!=(const char *a,const String &b)
{
return (!(a==b));
}
friend ostream& operator<<(ostream& stream,const String& a)
{
return (stream<<a.str);
}
friend istream& operator>>(istream& stream,const String& a)
{
return stream>>a.str;
}
/*-------------------Error from here-----------------------------*/
const String& operator=(const String& a)
/*Error:must be a nonstatic function*/
/*Error:must take exactly two arguments*/
//已订正
{
length=a.length;
/*invalid use of non-static data member*/
if(length>=this.capacity)/*invalid use again*/
{
delete str;
/*invalid use of 'this' in none member func.*/
/*non-static data member again*/
str=new char[length+1];
capacity=length+1;
strcpy(str,a.str);
//以下关於str、length、capacity几乎都有invalid use的问题
//friend 订正完後没事了
}
else
{
strcpy(str,a.str);
}
}
const String& operator=(const char* a)
/*Error:must be a nonstatic function
Error:must take exactly two arguments*/
//已订正
{
length=strlen(a);
if(length>=capacity)
{
delete str;
str=new char[length+1];
capacity=length+1;
strcpy(str,a);
}
else
{
strcpy(str,a);
}
}
friend const String operator+(const String& a,String& b)
{
char *k=new char[a.length+b.length+1];
strcpy(k,a.str);
strcat(k,b.str);
String Sum(k);
return Sum;
}
friend const String operator+(const char* a,String& b)
{
char *k=new char[strlen(a)+b.length+1];
strcpy(k,a);
strcat(k,b.str);
String Sum(k);
return Sum;
}
friend const String operator+(const String& a,char* b)
{
char *k=new char[a.length+strlen(b)+1];
strcpy(k,a.str);
strcat(k,b);
String Sum(k);
return Sum;
}
};
/*
请问要怎麽改才对呢?
另外,有时後会看到operator+(单引数)
但Dev C++会显示错误
又是怎麽回事(已解)
*/
/*
再问一个问题
就是使用字串加法的时候
编译器会显示no matching function for call to 'String::String(const String)'
candidates are: String::String(String&) String::String(char*)
是指怎样的错?
(建构式要加上const,否则operator在配置暂存的String时会出错)
*/
-
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.165.105.228
1F:→ weiyucsie:首先就是memset那边可能不该写sizeof(str) 05/21 20:50
2F:→ zenixls2:那边我确定可以这样用,相当於完全清空 测试也没事 05/21 20:52
3F:→ legnaleurc:sizeof(str)是4或8 05/21 20:56
4F:→ legnaleurc:该是member的就member,不要全部无限上纲成friend 05/21 20:59
5F:→ zenixls2:啊!...我知道什麽意思了 非常感谢 05/21 21:03
※ 编辑: zenixls2 来自: 218.165.105.228 (05/21 21:30)
6F:→ weiyucsie:印象中this应该是个指标 要写this-> 05/21 21:26
7F:→ weiyucsie:然後可能就像四楼说的 有些可以不用friend 05/21 21:28
8F:→ weiyucsie:感觉一个参数的operator=不用加friend 因为都是String 05/21 21:29
9F:→ weiyucsie:(不知道有没有记错 太久没用c++的friend了) 05/21 21:29
10F:→ zenixls2:friend订正过了 感谢 05/21 21:38
※ 编辑: zenixls2 来自: 218.165.105.228 (05/21 21:48)
11F:→ zenixls2:有人能解我最後一个疑惑吗? 05/21 22:18
12F:→ akasan:String(const String&) 05/21 22:44
13F:→ akasan:String(const char*) 05/21 22:45
※ 编辑: zenixls2 来自: 218.165.100.123 (05/22 21:04)