The below is a
C++ implementation of a very basic string class, meant to illustrate the concept. It encapsulates much of the common used functionality of the
str functions, but is by no means complete.
Example usage:
MyString str1 = "Foobar";
MyString str2 = str.Slice(1,3);
// str2 now contains "Foo"
MyString str3 = str2;
// str3 now equals str 2.
MyString str4 = str2 + str1;
// str4 now contains "FooFoobar"
MyString str5 = "FooFoobar";
if ( str5 == str4 ) cout << "str5 == str4";
cout << str5[1]; // outputs "o"
class MyString {
public:
char *data;
MyString();
MyString(MyString& rhs);
MyString(const char* rhs);
~MyString();
MyString& operator+(const MyString& rhs);
MyString& operator=(const MyString& rhs);
MyString& operator=(const char* rhs);
char operator[](int Index);
char *Slice(int from, int offset);
operator char *() const { return data; }
bool operator==(const MyString& rhs);
char* CString();
size_t Strlen();
};
MyString::MyString() {
data = 0;
}
MyString::MyString(MyString& rhs ) {
data = new char[rhs.Strlen()];
strcpy(data,rhs.data);
}
MyString::MyString(const char* rhs) {
if (! rhs ) {
data = 0;
return;
}
data = new char[strlen(rhs)];
strcpy(data,rhs);
}
MyString::~MyString() {
delete[] data;
}
MyString& MyString::operator+( const MyString& rhs ) {
MyString* NewString = new MyString;
NewString->data = new char[strlen(rhs.data)+strlen(data)];
strcpy(NewString->data,data);
strcat(NewString->data,rhs.data);
return *NewString;
}
MyString& MyString::operator=( const MyString& rhs ) {
if ( rhs == *this ) // assignment to self is bad!
return *this;
strcpy(data,rhs.data);
return *this;
}
bool MyString::operator==( const MyString& rhs ) {
if ( strcmp(rhs.data, data) == 0 )
return true;
return false;
}
MyString& MyString::operator=(const char* rhs) {
if ( rhs == data )
return *this;
strcpy(data,rhs);
return *this;
}
char MyString::operator[](int index) {
if ( index > Strlen() || index < 0 )
return 0;
return data[index];
}
char *MyString::Slice(int from, int offset) {
size_t size = Strlen();
size_t SizeOfSlice = offset;
if ( from + offset > size || from + offset < 0 )
return 0;
char *New = new char[SizeOfSlice];
char *DataIter = data + from;
for (int i = 0; i < SizeOfSlice; i++ ) {
*New++ = *DataIter++;
}
*New = '\0';
return (New-SizeOfSlice);
}
size_t MyString::Strlen() {
return strlen(data);
}
char *MyString::CString() {
return data;
}