Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите как сделать оператор потока в классе, оператор потока в классе 
:(
    Опции темы
gAlexKo
Дата 8.4.2021, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Нужно в строковом потоке выводить переменную 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;
}


PM MAIL   Вверх
gAlexKo
Дата 8.4.2021, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Заменил stringstream на ostream и прокатило. Хотя и непонятно. ;-)
PM MAIL   Вверх
xvr
Дата 9.4.2021, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



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

PM MAIL   Вверх
gAlexKo
Дата 9.4.2021, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Цитата(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;
Код



PM MAIL   Вверх
xvr
Дата 16.4.2021, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



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

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

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

А вот 
Код

ss << val1 << "[";

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1117 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.