Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
#1

Наследование от ofstream и перегрузка << - C++

14.07.2015, 14:36. Просмотров 1578. Ответов 70
Метки нет (Все метки)

Добрый день, гуглил на английском языке, но ответа не попалось. Предыстория: некий объекта принимает в качестве параметра ссылку на ostream, куда подсовывается ofstream. Задача в том, что перед действием << требуется сделать дополнительные телодвижения, а точнее обработать данные, которые направляются на выход. Я вижу решение таким, что нужно наследоваться от ofstream и переопределить <<. как это правильно делается нагуглить не удалось. Буду рад приведенным примерам или ссылкам на статьи об этом. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2015, 14:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование от ofstream и перегрузка << (C++):

Перегрузка ifstream и ofstream? - C++
Есть класс //test.h cass test { private: int i; string st; public:

Перегрузка ofstream, istream - C++
В общем-то ошибка в описана в самом коде //main.cpp #include &quot;ui.cpp&quot; int main() { ui iu; iu.menu(); iu.casein(); ...

Перегрузка ofstream / ifstream для классов - C++
Приветствую! Возникла трудность. Имеется класс с данными. Необходимо реализовать чтение и ввод объекта класса в файл посредством перегрузки...

Перегрузка ifstream и ofstream для работы с файлами в little-endian формате? - C++
Всем привет, мне нужно реализовать классы для работы с файлами в little-endian формате. Для этого задумал сделать public-потомки...

Наследование и перегрузка << - C++
Здравствуйте! Столкнулся со следующей проблемой: class A { int data,info; // .. public: friend void operator &lt;&lt;(ostream &amp;a,...

Наследование и перегрузка операторов - C++
Помогите, пожалуйста! Ткните носом в ошибки.. не судите строго - первая прога в С++, как и в объектно-ориент программировании: ...

70
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
14.07.2015, 14:39 #2
Наследоваться точно не надо. Не понятна проблема, в чем проблема обработать данные в отдельной функции/в перегруженном операторе вывода?
0
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
14.07.2015, 14:44  [ТС] #3
проблема в том, что объект который отправляет данные уже "делает это" в ofstream. Есть способ не переписывая "источник данных" заставить отправлять их в какой-то не наследуемый от ofstream объект?
п.с. я просто новичек в С++, мож не знаю каких-то фишек...

грубо говоря, источник данных имеет возможность писать список имён в ofstream. сейчас задача состоит в том, чтоб некоторые имена блокировать (как буд-то их нет)
0
vxg
Модератор
3172 / 1975 / 222
Регистрация: 13.01.2012
Сообщений: 7,607
14.07.2015, 14:45 #4
Цитата Сообщение от VVildVVolf Посмотреть сообщение
некий объекта принимает в качестве параметра ссылку на ostream
не факт что этот объект делает вывод через << - речь идет именно о передачи объекту ссылки или оператор << перегружен для этого объекта?
0
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
14.07.2015, 14:57  [ТС] #5
исходники для меня открыты, так что я знаю, что вывод делается через <<
внутри что-то вроде
C++
1
2
3
4
class DataSource{
public:
    void print(ostream& output){output<<"{name:'Fedya'}"};
}
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
14.07.2015, 15:34 #6
VVildVVolf, Я бы таки предпочел весь код оператора вывода, ибо непонятно, что вы хотите фильтровать в функции print на данный момент. Но как бы то ни было - есть доступ к изменению print - изменяйте, нет - пишите функцию, которая будет зваться перед выводом и фильтровать нужные имена.
Можно конечно и boost::iostreams попробовать поюзать, но это дикий оверкил и бессмысленно.
0
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
14.07.2015, 15:52  [ТС] #7
Код немного размазан по проекту, и, если честно, ostream передаётся в конструктор объекта "источник данных". на данный момент в функции print я хочу фильтровать по сути наборы символов, которые получаются на выходе (просто обработать вывод). если непонятна цель задачи, тогда попробую поставить более простую:
C++
1
2
3
4
5
6
7
8
9
class DataSource{
public:
    DataSource(ostream& s):output(s){};
    void Print(){
        output<<"aaSSvvKK";
    }
private:
     ostream& output;
}
на данный момент передаётся ofstream (пишуший в файл), то, что запишет метод Print. нужно доработать так, чтоб в файл писалась та же строка, только в ЛоверКейсе. ну чтобы была возможность и по старому, и по новому.
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
14.07.2015, 16:02 #8
C++
1
2
3
DataSource ds(stream);
ds.ToLower();
dt.Print();
Или же
C++
1
ToLower(ds);
Почему не так? Фильтровать-то можно прям исходящий поток, но это несколько геморойно.
0
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
14.07.2015, 16:13  [ТС] #9
ведь задача ЛоверКейса - это просто пример я бы хотел предусмотреть ситуацию, чтобы можно было накладывать разные фильтры. DataSource не хотелось бы модифицировать, потому что это по сути не его зона ответственности, он в данной ситуации должен просто выдавать "грязные данные как есть".
насчет геморно - я об этом начал догадываться, когда не смог нагуглить пример этого процесса...
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
14.07.2015, 16:30 #10
Ну. Хм. Тогда действительно пишем наследника от ofstream/ostream перегружаем оператор вывода как нам надо, подаем в конструктор DataSource объект наследника.
0
vxg
Модератор
3172 / 1975 / 222
Регистрация: 13.01.2012
Сообщений: 7,607
14.07.2015, 16:31 #11
Цитата Сообщение от VVildVVolf Посмотреть сообщение
нужно доработать так
первое что приходит в голову - наследовать от streambuf, переделывать там виртуальные функции, создавать наследника ostream основанного на этом streambuf и подсовывать его. но в streambuf будет весело все это дело ловить

Добавлено через 35 секунд
Цитата Сообщение от ForEveR Посмотреть сообщение
пишем наследника от ofstream/ostream перегружаем оператор вывода как нам надо
они вроде как не виртуальные. перегрузка ничего не даст
0
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
14.07.2015, 16:35  [ТС] #12
таки изначально вопрос стоял "как это сделать"... но я очень рад, что так быстро пришли к взаимопониманию =)

п.с. меня натолкнули на мысль, как вариант можно толкать stringstream, а потом его сувать в фильтры, это лучше/хуже?
п.с.с. На будущее всё равно хотелось бы увидеть решение изначально поставленной задачи, ибо нельзя пробелы оставлять открытыми...
0
vxg
Модератор
3172 / 1975 / 222
Регистрация: 13.01.2012
Сообщений: 7,607
14.07.2015, 16:43 #13
Цитата Сообщение от VVildVVolf Посмотреть сообщение
можно толкать stringstream
толкать в поток а потом пропускать его через любые комбайны это здравая мысль фактически ничем не отличающаяся от копания в streambuf
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
14.07.2015, 16:54 #14
Очень простой пример фильтрации.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <functional>
#include <algorithm>
 
class formatting_ostream
{
public:
   typedef std::function<std::string(const std::string&)> filter_t;
   formatting_ostream(std::ostream& stream, const filter_t& filter) : stream_(stream), filter_(filter)
   {
   }
   formatting_ostream& operator << (const std::string& value)
   {
      const std::string filtered = filter_(value);
      stream_ << filtered << std::endl;
      return *this;
   }
private:
   std::ostream& stream_;
   filter_t filter_;
};
 
class source
{
public:
   source(formatting_ostream& stream) : stream_(stream)
   {
   }
   void print()
   {
      stream_ << "HeLLo";
   }
private:
   formatting_ostream& stream_;
};
 
int main()
{
   auto to_lower = [](const std::string& v) -> std::string
   {
      std::string result;
      std::transform(v.begin(), v.end(), std::back_inserter(result), tolower);
      return result;
   };
   formatting_ostream stream(std::cout, to_lower);
   source s(stream);
   s.print();
}
Конечно, если source должен конструироваться именно от ostream это будет значительно сложнее.

Добавлено через 5 минут
По поводу того как правильно должен быть реализован formatting_ostream можно посмотреть на boost/log.
2
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
14.07.2015, 16:56  [ТС] #15
в том-то и дело, что он конструируется от ostream, ибо этот объект - место куда сливаются в итоге данные...

"фактически ничем не отличающаяся от копания в streambuf" - разница лишь в том, что решение на основе stringstream гуглить проще, а альтернативное (как мне пока что кажется) лаконичнее, поэтому хотелось бы увидеть пример наследования и оверрайда..
0
14.07.2015, 16:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2015, 16:56
Привет! Вот еще темы с ответами:

Наследование и перегрузка методов - C++
Здравствуйте. Пытаюсь выполнить упр. 8 из главы 11 книги Р.Лафоре &quot;ООП в С++&quot;, соорудил такое древо классов (картинка в конце поста). Если...

Наследование и перегрузка операторов. - C++
У меня есть базовый класс class myfloat { protected: int c; int z; void reduce(); public: myfloat(float num=0);

Наследование, перегрузка, конструктор - C++
#include &lt;iostream&gt; class animal { public: animal() { } animal(int a) { age = a; } ~animal() { } void set_age(int b) { age...

Перегрузка оператора ввода и наследование - C++
Добрый день! Обращаюсь по такому поводу. Есть одна программа, в которой требуется перегрузить операторы ввода.вывода для одного из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru