Подтвердить что ты не робот

ToString переопределить в С++

В Java, когда класс переопределяет .toString(), и вы выполняете System.out.println(), он будет использовать это.

class MyObj {
    public String toString() { return "Hi"; }
}
...
x = new MyObj();
System.out.println(x); // prints Hi

Как я могу выполнить это на С++, чтобы:

Object x = new Object();
std::cout << *x << endl;

Выведет какое-то содержательное строковое представление, которое я выбрал для Object?

4b9b3361

Ответ 1

std::ostream & operator<<(std::ostream & Str, Object const & v) { 
  // print something from v to str, e.g: Str << v.getX();
  return Str;
}

Если вы пишете это в файле заголовка, не забудьте отметить функцию inline: inline std::ostream & operator<<(... (см. С++ Super-FAQ для чего.)

Ответ 2

Альтернатива решению Erik вы можете переопределить оператор преобразования строк.

class MyObj {
public:
    operator std::string() const { return "Hi"; }
}

При таком подходе вы можете использовать свои объекты везде, где требуется строковый вывод. Вы не ограничены потоками.

Однако этот тип операторов преобразования может привести к непреднамеренным преобразованиям и ошибкам, затрудняющим отслеживание. Я рекомендую использовать это только для классов с текстовой семантикой, таких как Path, a UserName и SerialCode.

Ответ 3

 class MyClass {
    friend std::ostream & operator<<(std::ostream & _stream, MyClass const & mc) {
        _stream << mc.m_sample_ivar << ' ' << mc.m_sample_fvar << std::endl;
    }

    int m_sample_ivar;
    float m_sample_fvar;
 };

Ответ 4

Хотя переопределение оператора - приятное решение, мне удобнее что-то более простое, чем следующее (что также кажется более вероятным для Java):

char* MyClass::toString() {
    char* s = new char[MAX_STR_LEN];
    sprintf_s(s, MAX_STR_LEN, 
             "Value of var1=%d \nValue of var2=%d\n",
              var1, var2);
    return s;
}