C ++ эквивалент ToString Java? - PullRequest
       13

C ++ эквивалент ToString Java?

131 голосов
/ 11 октября 2009

Я бы хотел контролировать то, что записывается в поток, т.е. cout, для объекта пользовательского класса. Это возможно в C ++? В Java вы можете переопределить метод toString() для аналогичной цели.

Ответы [ 5 ]

156 голосов
/ 11 октября 2009

В C ++ вы можете перегрузить operator<< для ostream и ваш собственный класс:

class A {
public:
  int i;
};

std::ostream& operator<<(std::ostream &strm, const A &a) {
  return strm << "A(" << a.i << ")";
}

Таким образом, вы можете выводить экземпляры вашего класса в потоки:

A x = ...;
std::cout << x << std::endl;

Если ваш operator<< хочет распечатать внутреннее содержимое класса A и действительно нуждается в доступе к его закрытым и защищенным членам, вы также можете объявить его как функцию друга:

class A {
private:
  friend std::ostream& operator<<(std::ostream&, const A&);
  int j;
};

std::ostream& operator<<(std::ostream &strm, const A &a) {
  return strm << "A(" << a.j << ")";
}
47 голосов
/ 11 октября 2009

Вы также можете сделать это таким образом, разрешив полиморфизм:

class Base {
public:
   virtual std::ostream& dump(std::ostream& o) const {
      return o << "Base: " << b << "; ";
   }
private:
  int b;
};

class Derived : public Base {
public:
   virtual std::ostream& dump(std::ostream& o) const {
      return o << "Derived: " << d << "; ";
   }
private:
   int d;
}

std::ostream& operator<<(std::ostream& o, const Base& b) { return b.dump(o); }
27 голосов
/ 08 января 2013

В C ++ 11 to_string наконец добавляется в стандарт.

http://en.cppreference.com/w/cpp/string/basic_string/to_string

10 голосов
/ 11 октября 2009

В качестве дополнения к тому, что сказал Джон, если вы хотите извлечь строковое представление и сохранить его в std::string, сделайте следующее:

#include <sstream>    
// ...
// Suppose a class A
A a;
std::stringstream sstream;
sstream << a;
std::string s = sstream.str(); // or you could use sstream >> s but that would skip out whitespace

std::stringstream находится в заголовке <sstream>.

6 голосов
/ 24 июня 2016

На вопрос дан ответ. Но я хотел бы добавить конкретный пример.

class Point{

public:
      Point(int theX, int theY) :x(theX), y(theY)
      {}
      // Print the object
      friend ostream& operator <<(ostream& outputStream, const Point& p);
private:
      int x;
      int y;
};

ostream& operator <<(ostream& outputStream, const Point& p){
       int posX = p.x;
       int posY = p.y;

       outputStream << "x="<<posX<<","<<"y="<<posY;
      return outputStream;
}

Этот пример требует понимания перегрузки оператора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...