From 401ed2b66c9e80eecaf154f3a2ef932f919ae456 Mon Sep 17 00:00:00 2001 From: Kyle K Date: Sat, 5 May 2012 23:04:46 -0500 Subject: implement overloaded optrs and outward conversion --- main.cpp | 10 +++++----- string.cpp | 37 ++++++++++++++++++++++++++++++++++++- string.h | 11 +++++------ 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/main.cpp b/main.cpp index b951358..dd4810d 100644 --- a/main.cpp +++ b/main.cpp @@ -5,24 +5,24 @@ int main(int argc, char **argv) MyString mystr("alpha"); if (mystr.isSubstring("ph")) { - cout << "true" << endl; + std::cout << "true" << std::endl; } else - cout << "false" << endl; + std::cout << "false" << std::endl; MyString mystr1 = ", beta"; MyString mystr2 = ", charlie"; MyString mystr3 = ", delta"; mystr.concat(mystr1).concat(mystr2).concat(mystr3); - cout << mystr << endl; + std::cout << mystr << std::endl; MyString mystr4 = "hello"; mystr4.concat(", world!").concat(" goodbye"); - cout << mystr4 << endl; + std::cout << mystr4 << std::endl; MyString mystr5 = "bro"; - cout << mystr5 << endl; + std::cout << mystr5 << ", char at 1 is: " << mystr5[1] << std::endl; return 0; } diff --git a/string.cpp b/string.cpp index 393368f..42e97cc 100644 --- a/string.cpp +++ b/string.cpp @@ -139,8 +139,43 @@ bool operator==(const MyString& lhs, const MyString& rhs) * but it seems like the & is placed there so we can make consecutive overloaded * calls to cout, effectively chaining all of the calls */ -ostream& operator<<(ostream& ostr, const MyString& rhs) + +/* right now I think the reference is used to avoid returning copy of ostream + * so when calls are chained up we work on one ostream object only */ +std::ostream& operator<<(std::ostream& ostr, const MyString& rhs) { return (ostr << rhs.str_); } +/* unary operator operate on one operand, itself! */ +bool MyString::operator!(void) const +{ + return (this->length_ == 0); +} + +char& MyString::operator[](int i) +{ + /* references need to point to valid objects, all hell could breaks loose */ + return this->str_[i]; +} + +char MyString::operator[](int i) const +{ + if (i < 0 || i > this->length_ - 1) + return 0; + else + return this->str_[i]; +} + +MyString::operator char*() +{ + char *ret = new char[this->length_ + 1]; + if (ret) + { + strcpy(ret, this->str_); + return ret; + } + else + return NULL; +} + diff --git a/string.h b/string.h index dc9ebfc..dbc8e88 100644 --- a/string.h +++ b/string.h @@ -8,12 +8,10 @@ #include #include -using namespace std; - class MyString { friend bool operator==(const MyString&, const MyString &); - friend ostream& operator<<(ostream&, const MyString &); + friend std::ostream& operator<<(std::ostream&, const MyString &); private: char *str_; @@ -36,13 +34,14 @@ class MyString MyString& concat(const char *); void printStr(void) const; - MyString operator!() const; + bool operator!(void) const; char& operator[](int); char operator[](int) const; + operator char*(); /* outward class conversion into char * */ }; bool operator==(const MyString&, const MyString &); -ostream& operator<<(ostream&, const MyString &); +std::ostream& operator<<(std::ostream&, const MyString &); inline MyString::MyString() { @@ -66,7 +65,7 @@ inline int MyString::length() const inline void MyString::printStr(void) const { - cout << "length: " << length_ << ", value: \"" << str_ <<"\""; + std::cout << "length: " << length_ << ", value: \"" << str_ << "\""; } #endif -- cgit v1.2.3