HahaHortness
HahaHortness

Reputation: 1628

Formatting objects into strings

I'm coming back to c++ after using Java for a long time. In Java overriding the toString method on an object allows the object to be automatically translated into a string and concatenated to other strings.

class Test {
    public static void main(String[] args) {
        System.out.println(new Test() + " There"); // prints hello there
    }

    public String toString() {
        return "Hello";
    }
}

Is there anything similar that would allow me to stream an object into cout?

cout << Test() << endl;

Upvotes: 2

Views: 107

Answers (2)

Matteo Italia
Matteo Italia

Reputation: 126947

The common idiom is to create an overload of operator<< that takes an output stream as the left-hand operand.

#include <iostream>

struct Point
{
    double x;
    double y;
    Point(double X, double Y)
      : x(X), y(Y)
    {}
};

std::ostream & operator<<(std::ostream & Stream, const Point & Obj)
{
    // Here you can do whatever you want with your stream (Stream)
    // and the object being written into it (Obj)
    // For our point we can just print its coordinates
    Stream<<"{"<<Obj.x<<", "<<Obj.y<<"}";
    return Stream; // return the stream to allow chained writes
}

int main()
{
    Point APoint(10.4, 5.6);
    std::cout<<APoint<<std::endl; // this will print {10.4, 5.6}
    return 0;
}

If you want to support streams with other character types (e.g. wchar_t)/template parameters of the streams you have to write different overloads for the various types of streams you want to support, or, if your code is (more or less) independent from such types, you can simply write a template operator<<.

Upvotes: 2

Bill
Bill

Reputation: 14695

The equivalent is to overload operator<<:

#include <ostream>

class Test
{
  int t;
};

std::ostream& operator<<(std::ostream& os, const Test& t)
{
   os << "Hello";
   return os;
}

You would then use it like this:

#include <iostream>

int main()
{
  std::cout << Test() << " There" << std::endl;
}

See the code in action: http://codepad.org/pH1CVYPR

Upvotes: 5

Related Questions