Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Подскажите как сделать оператор потока в классе


Автор: gAlexKo 8.4.2021, 12:53
Нужно в строковом потоке выводить переменную to_index из объекта SIMV. Что-то забыл как это делается (или не знал никогда) ;-) 
Подскажите плиз.

Код

#include <windows.h>
#include <sstream>
using namespace std;

struct SIMV
{
unsigned char simv;     //код символа
int to_index;          //индекс в векторе подмены
int from_index;         //индекс откуда идет перемещение

   SIMV(void) { simv = 0; to_index = from_index = -1; }
   friend stringstream& operator<< (stringstream& out, SIMV &c)
    {
      out << c.to_index;
      return out;
    }
};

#pragma argsused
int main(int argc, char* argv[])
{
  int i=1;
  SIMV val1; val1.to_index = 22;
  stringstream ss;
  ss << "["<< i << "]=" << val1;

  string s = ss.str();
  MessageBox(0, s.c_str(), "Caption", MB_OK);
  return 0;
}


Автор: gAlexKo 8.4.2021, 13:14
Заменил stringstream на ostream и прокатило. Хотя и непонятно. ;-)

Автор: xvr 9.4.2021, 11:21
stringstream это частный случай ostream. Все операторы << делаются на самом базовом классе - ostream
В вашем исходном случае вывести в stringstream ваш SIMV получится, а вот вывести что нибудь после этого (сцепив << ) - нет, т.к. возвращаемый результат stringstream&, а для него все остальные << (для других типов) не описаны

Автор: gAlexKo 9.4.2021, 12:04
Цитата(xvr @ 9.4.2021,  11:21)
stringstream это частный случай ostream. Все операторы << делаются на самом базовом классе - ostream
В вашем исходном случае вывести в stringstream ваш SIMV получится, а вот вывести что нибудь после этого (сцепив << ) - нет, т.к. возвращаемый результат stringstream&, а для него все остальные << (для других типов) не описаны


Немного не понял о "выводе после". Ведь в примере есть вывод по цепочке переменной i. Значит у стандартных типов вывод потоком в строку предусмотрен. Не могли вы написать то что не должно работать?

[code=cpp]
  int i=1;
  SIMV val1; val1.to_index = 22;
  stringstream ss;
  ss << "["<< i << "]=" << val1;
Код



Автор: xvr 16.4.2021, 16:19
Всё просто, нужно только развернуть последовательность << в вызовы методов:
Код

operator<< (operator << (operator <<(operator<<(ss, "["), i), "]="), val1);

Какой тип параметров у самого внешнего operator <<? ostream и SIMV (ostream потому что первый вложенный operator<< возвращает именно ostream). Ваш operator<< (stringstream&, SIMV&) не подойдет - тип стрима не тот

А вот 
Код

ss << val1 << "[";

откомпилируется - результат ss << val1 будет stringstream&, а он в ostream& преобразуется (тут я был слегка не прав)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)