#include <cstring>
#include <iostream>
using
namespace
std;
class
Mystring {
friend
ostream&
operator<<(
ostream& os,
const
Mystring& obj);
friend
istream& operator>>(
istream& is,
Mystring& obj);
friend
Mystring operator+(
const
Mystring& lhs,
const
Mystring& rhs);
char
* str;
public
:
Mystring();
void
pop_bk();
void
push_bk(
char
a);
int
get_length();
void
copy(
char
s[],
int
len,
int
pos);
void
swp(Mystring& rhs);
Mystring(
char
* val);
Mystring(
const
Mystring& source);
Mystring(Mystring&& source);
Mystring& operator=(
const
Mystring& rhs);
~Mystring() {
delete
str; }
};
Mystring& Mystring::operator=(
const
Mystring& rhs)
{
if
(
this
== &rhs)
return
*
this
;
delete
[] str;
str =
new
char
[
strlen
(rhs.str) + 1];
strcpy
(str, rhs.str);
return
*
this
;
}
Mystring operator+(
const
Mystring& lhs,
const
Mystring& rhs)
{
int
length =
strlen
(lhs.str)
+
strlen
(rhs.str);
char
* buff =
new
char
[length + 1];
strcpy
(buff, lhs.str);
strcat
(buff, rhs.str);
buff[length] =
'\0'
;
Mystring temp{ buff };
delete
[] buff;
return
temp;
}
istream& operator>>(istream& is,
Mystring& obj)
{
char
* buff =
new
char
[1000];
memset
(&buff[0], 0,
sizeof
(buff));
is >> buff;
obj = Mystring{ buff };
delete
[] buff;
return
is;
}
ostream& operator<<(ostream& os,
const
Mystring& obj)
{
os << obj.str;
return
os;
}
void
Mystring::swp(Mystring& rhs)
{
Mystring temp{ rhs };
rhs = *
this
;
*
this
= temp;
}
void
Mystring::copy(
char
s[],
int
len,
int
pos)
{
for
(
int
i = 0; i < len; i++) {
s[i] = str[pos + i];
}
s[len] =
'\0'
;
}
void
Mystring::push_bk(
char
a)
{
int
length =
strlen
(str);
char
* buff =
new
char
[length + 2];
for
(
int
i = 0; i < length; i++) {
buff[i] = str[i];
}
buff[length] = a;
buff[length + 1] =
'\0'
;
*
this
= Mystring{ buff };
delete
[] buff;
}
void
Mystring::pop_bk()
{
int
length =
strlen
(str);
char
* buff =
new
char
[length];
for
(
int
i = 0; i < length - 1; i++)
buff[i] = str[i];
buff[length-1] =
'\0'
;
*
this
= Mystring{ buff };
delete
[] buff;
}
int
Mystring::get_length()
{
return
strlen
(str);
}
Mystring::Mystring()
: str{ nullptr }
{
str =
new
char
[1];
str[0] =
'\0'
;
}
Mystring::Mystring(
char
* val)
{
if
(val == nullptr) {
str =
new
char
[1];
str[0] =
'\0'
;
}
else
{
str =
new
char
[
strlen
(val) + 1];
strcpy
(str, val);
str[
strlen
(val)] =
'\0'
;
}
}
Mystring::Mystring(
const
Mystring& source)
{
str =
new
char
[
strlen
(source.str) + 1];
strcpy
(str, source.str);
}
Mystring::Mystring(Mystring&& source)
{
str = source.str;
source.str = nullptr;
}
int
main()
{
Mystring a;
char
temp[] =
"Hello"
;
Mystring b{ temp };
Mystring c{ a };
char
temp1[] =
"World"
;
Mystring d{ Mystring{ temp } };
b.pop_bk();
cout <<
"Mystring b: "
<< b << endl;
b.push_bk(
'o'
);
cout <<
"Mystring b: "
<< b << endl;
cout <<
"Length of Mystring b: "
<< b << endl;
char
arr[80];
b.cpy(arr, 3, 0);
cout <<
"arr is: "
<< arr << endl;
d.swp(b);
cout << d <<
" "
<< b << endl;
d = b + b;
cout <<
"string d: "
<< d << endl;
return
0;
}