string operator overloading

Hi,

String &operator+=(const String &)

How do I write the operator+= code?
You append the passed string to *this and return *this.

1
2
3
4
5
String &operator+=(const String &s1)
{
	rep->s += *s1.rep->s;
	return *this;
}


I did like the one above does not work.
Are we supposed to guess what "rep->s" is?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
class String{
	struct 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 &s);
	Srep &operator=(const Srep &s);

	};

	Srep *rep;
public:
	class Cref{        // reference to char
		friend class String;
		String &s;
		int i;
		Cref(String &ss, int ii):s(ss), i(ii){}
	public:
		operator char() { return s.Read(i);}
		void  operator=(char c){s.write(i, c);}
	};
	class Range{
		char *s;
	public:
		Range(char *ss):s(ss){}
	};
	String()
	{
		rep = new Srep(0, "");
	}
	String(const char *s)
	{	

		rep = new Srep(strlen(s), s);
	}
	String(const String &s)
	{
		s.rep->n++;
		rep = s.rep;   // Share representation 
	}
	String &operator=(const char *s)
	{
		if (rep->n == 1)
			rep->assign(strlen(s), s);
		else {
			rep->n--;
			rep = new Srep(strlen(s), s);
		};

		return *this;
	}
	String &operator=(const String &s)
	{
		s.rep->n++;
		if(--rep->n == 0)
			delete rep;
		rep = s.rep;
		return *this;
	}
	~String()
	{
		if (--rep->n == 0)
			delete rep;

	}

	void check(int i)const
	{
		if (i < 0 || rep->sz <= i)
			throw Range("entered value is error");
	}
	char Read(int i)const
	{
		return rep->s[i];
	}
	void write(int i, char c)
	{
		rep  = rep->get_own_copy(), rep->s[i] = c;

	}
	Cref operator[](int i)
	{
		check(i);
		return Cref(*this, i);
	}
	char operator[](int i)const
	{
		check(i);
		return rep->s[i];
	}


	//operator char*()const
	//{
	//	return rep->s;
	//}

 //   operator const char*()const
	//{
	//	return rep->s;
	//}



	String &operator+=(const String &s1)
	{
		*this += s1.rep->s;
		return *this;
	}

	String &operator +=(const char *s1)
	{
		*this->rep->s += *s1;
		return *this;

	}
};

All of the code..
Well, you'll probably have to resize your internal array and append the string.
You can use strcat for that:
http://www.cplusplus.com/reference/clibrary/cstring/strcat/
standards of the string works like this?
Standard string implementations generally don't call strcat, but they obviously have to do something that is equivalent to get the appending done. You just need to copy all characters from the passed string right after the end of your current string.
Last edited on
I understand different Standard string.Can I do with just strcat?
thanks.
The problem was solved
Topic archived. No new replies allowed.