Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Return value for a << operator function of a custom string class in C++

I am trying to create my own std::string wrapper to extend its functionality. But I got a problem when declaring the << operator. Here's my code so far:

my custom string class:

class MyCustomString : private std::string
{
public:
  std::string data;
  MyCustomString() { data.assign(""); }
  MyCustomString(char *value) { data.assign(value); }
  void Assign(char *value) { data.assign(value); }
  // ...other useful functions
  std::string & operator << (const MyCustomString &src) { return this->data; }
};

the main program:

int main()
{
  MyCustomString mystring("Hello");
  std::cout << mystring; // error C2243: 'type cast' : conversion from 'MyCustomString *' to 'const std::basic_string<_Elem,_Traits,_Ax> &' exists, but is inaccessible

  return 0;
}

I wanted cout to treat the class as a std::string, so that I won't need to do something like:

std::cout << mystring.data;

Any kind of help would be appreciated!

Thanks.

Just fyi: my IDE is Microsoft Visual C++ 2008 Express Edition.

like image 559
Yana D. Nugraha Avatar asked Dec 18 '22 06:12

Yana D. Nugraha


2 Answers

If you look at how all stream operators are declared they are of the form:

ostream& operator<<(ostream& out, const someType& val );

Essentially you want your overloaded function to actually do the output operation and then return the new updated stream operator. What I would suggest doing is the following, note that this is a global function, not a member of your class:

ostream& operator<< (ostream& out, const MyCustomString& str )
{
    return out << str.data;
}

Note that if your 'data' object was private, which basic OOP says it probably should, you can declare the above operator internally as a 'friend' function. This will allow it to access the private data variable.

like image 179
DeusAduro Avatar answered Dec 19 '22 20:12

DeusAduro


You need a free-standing function (friend of your class, if you make your data private as you probably should!)

inline std::ostream & operator<<(std::ostream &o, const MyCustomString&& d)
{
    return o << d.data;
}
like image 35
Alex Martelli Avatar answered Dec 19 '22 19:12

Alex Martelli