#include
#include
#include
using namespace std;
class StringClass {
char *p;
int len;
public:
StringClass(char *s);
~StringClass() {
cout << "Freeing " << (unsigned) p << '\n';
delete [] p;
}
char *get() { return p; }
StringClass &operator=(StringClass &ob);
char &operator[](int i);
};
StringClass::StringClass(char *s)
{
int l;
l = strlen(s)+1;
p = new char [l];
if(!p) {
cout << "Allocation error\n";
exit(1);
}
len = l;
strcpy(p, s);
}
// = operator
StringClass &StringClass::operator=(StringClass &ob)
{
// see if more memory is needed
if(len < ob.len) { // need to allocate more memory
delete [] p;
p = new char [ob.len];
if(!p) {
cout << "Allocation error\n";
exit(1);
}
}
len = ob.len;
strcpy(p, ob.p);
return *this;
}
//
char &StringClass::operator[](int i)
{
if(i <0 || i>len-1) {
cout << "\nIndex value of ";
cout << i << " is out-of-bounds.\n";
exit(1);
}
return p[ i ];
}
int main()
{
StringClass a("Hello"), b("There");
cout << a.get() << '\n';
cout << b.get() << '\n';
a = b; // now p is not overwritten
cout << a.get() << '\n';
cout << b.get() << '\n';
cout << a[0] << a[1] << a[2] << endl;
a[0] = 'X';
a[1] = 'Y';
a[2] = 'Z';
cout << a.get() << endl;
return 0;
}