运算符重载问题

SeventhBlue 2018-12-07 07:33:31

#include<iostream>

class String{
struct Srep; //表示
Srep* rep;
public:
class Cref{ //引用char
friend class String;
String& s;
int i;
Cref(String& ss,int ii):s(ss),i(ii){}
public:
operator char() const
{
return s.read(i);
}
void operator= (char c)
{
s.write(i,c);
}
};
class Range{}; //用于异常

String(); //x = ""
String(const char*); //x = "abc"
String(const String&);//x = other_String
String& operator= (const char*);
String& operator= (const String&);
~String();

void check(int) const;
char read(int) const;
void write(int,char);
Cref operator[] (int);
char operator[] (int i) const;
int size() const;

String& operator+=(const String&);
String& opetator+=(const char*);

void show() const;
};


#include"String.h"
#include<string.h>

struct String::Srep{
char* s; //到元素的指针
int sz; //字符个数
int n; //引用计数

Srep(int nsz,const char* p)
{
n = 1;
sz = nsz;
s = new char[sz + 1];//为了结束符增加空间
strcpy(s,p);
}
~Srep()
{
delete[] s;
}
Srep* get_own_copy() //需要时克隆
{
if(n == 1) return this;
n--;
return new Srep(sz,s);
}
void assign(int nsz,const char* p)
{
if(sz != nsz){
delete[] s;
sz = nsz;
s = new char[sz + 1];
}
strcpy(s,p);
}
private:
Srep(const Srep&);
Srep& operator= (const Srep&);
};

String::String() //以空串为默认值
{
rep = new Srep(0,"");
}
String::String(const String& x) //复制构造函数
{
x.rep->n++;
rep = x.rep; //共享表示
}
String::~String()
{
if(--rep->n == 0) delete rep;
}
String& String::operator= (const String& x) //复制赋值
{
x.rep->n++; //保护,防止“st=st”
if(--rep->n == 0) delete rep;
rep = x.rep; //共享表示
return *this;
}

//伪装的复制运算以const char* 作为参数,以提供字符串文字量
String::String(const char* s)
{
rep = new Srep(strlen(s),s);
}
String& String::operator= (const char* s)
{
if(rep->n == 1)
rep->assign(strlen(s),s); //再利用Srep
else{
rep->n--;
rep = new Srep(strlen(s),s);//使用新的Srep
}
return *this;
}

void String::check(int i) const
{
if(i < 0 || rep->sz <= i)
throw Range();
}
char String::read(int i) const
{
return rep->s[i];
}
void String::write(int i,char c)
{
rep = rep->get_own_copy();
rep->s[i] = c;
}
String::Cref String::operator[] (int i)
{
check(i);
return Cref(*this,i);
}
char String::operator[] (int i) const
{
check(i);
return rep->s[i];
}
int String::size() const
{
return rep->sz;
}
void String::show()const
{
std::cout<<this->rep->s;
}



上面是头文件String.h代码,中间是定义类String.cpp的代码,下面是编译器报错的截图。请问这是什么原因呀?我申明在类外也有这样的错。除了+=符号的重载,其他代码都是对的,可以运行。代码是C++程序设计语言书上的。
...全文
248 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
SeventhBlue 2018-12-09
  • 打赏
  • 举报
回复
引用 1 楼 sdghchj 的回复:
operator,怎么写?
o p e r a t o r

尴尬,我也是查过单词是否出现错误的。谢谢了呀。
SeventhBlue 2018-12-09
  • 打赏
  • 举报
回复
引用 2 楼 赵4老师 的回复:
关于自己是否适合编程的很简单的测试:
在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案:

A里面有10处以上文字或标点错误
B里面没有文字或标点错误并敢为此跟人打赌
C里面没有文字或标点错误并且字体和排版完全与原稿一致
D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感

A不适合编程(理由:打字准确度偏低、粗心大意)
B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念)
C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证)
D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!)

如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

把问题想深,并试从根本上找到问题产生的原因,以防以后再次发生,这是非常好的进步做法,而不是从根本上开始怀疑自己。按照你这样的做法,我昨天吃饭噎住了,那是不是吃了20多年饭的我,要考虑自己是否适合吃饭?老师你发的这个测试我好像在哪看到过,1000字我倒是没有打过,但是连续一两千行代码也不是没有,不是复制粘贴的,是纯手工码的,当然和你说的测试可能不同,我毕竟是有码错的就修改了,也没有和人打赌。项目经理不是因为做到了码1000字和原文一模一样就能担当,而是曾经从小白有错就改,到对细节追求完美、对项目宏观调控无线积累过程而来的。要是按照这个测试的标准的话,有一大批的非常优秀码字员能够担任项目经理。

好吧,实实在在的杠精一把了。感谢所有人的帮助回复了。赵4老师这个好似熟悉呀,应该是我辈学习模仿的优秀榜样了。
赵4老师 2018-12-08
  • 打赏
  • 举报
回复
关于自己是否适合编程的很简单的测试: 在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案: A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感 A不适合编程(理由:打字准确度偏低、粗心大意) B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念) C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证) D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!) 如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
sdghchj 2018-12-07
  • 打赏
  • 举报
回复
operator,怎么写?
o p e r a t o r

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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