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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатель на объекты с оператором << 
V
    Опции темы
asmdzen
Дата 18.7.2011, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



Пытаюсь написать класс лога, данные должны выводятся в объект поддерживающий operator <<
т.е. во время работы можно менять(добавлять) объект вывода.
как должен выглядеть прототип функции принимающей в качестве параметра указатель на объект поддерживающий << (например ostream, ofstream или что-то свое), без надобности все объекты наследовать от какого-то базового класса?

Код

void Str2Obj(string str, neponjatno4to* ptr)
{
   *prt << str;
}

или все же придется шаблон писать?

Это сообщение отредактировал(а) asmdzen - 18.7.2011, 11:23
PM MAIL   Вверх
bsa
Дата 18.7.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



asmdzen, или шаблон, или наследование.
На твоем бы месте я воспользовался std::ostream и передавал бы ему только разные объекты наследников streambuf. В итоге, уже имеется поддержка всех стандартных типов, а писать нужно минимум кода, необходимый для поддержки именно твоего устройства вывода лога.
PM   Вверх
asmdzen
Дата 18.7.2011, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



идея отличная, только жадность душит, я передаю конечному объекту только string'и созданные boost::format'ом (на форуме нашел)(просто постоянные log() << "n =" << n << ";" задолбали, форматированная строка по мне лучше). думаю может лучше все таки держать только указатели на функции принимающие в качестве параметра string? но как тогда быть с методами классов?
PM MAIL   Вверх
borisbn
Дата 18.7.2011, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(asmdzen @  18.7.2011,  14:58 Найти цитируемый пост)
думаю может лучше все таки держать только указатели на функции принимающие в качестве параметра string

где держать ?
Цитата(asmdzen @  18.7.2011,  14:58 Найти цитируемый пост)
но как тогда быть с методами классов?

mem_fun
?

Добавлено @ 17:47
Цитата(asmdzen @  18.7.2011,  14:58 Найти цитируемый пост)
постоянные log() << "n =" << n << ";" задолбали, форматированная строка по мне лучше

 smile 

Это сообщение отредактировал(а) borisbn - 18.7.2011, 17:48


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Сыроежка
Дата 18.7.2011, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(asmdzen @  18.7.2011,  11:22 Найти цитируемый пост)
Пытаюсь написать класс лога, данные должны выводятся в объект поддерживающий operator <<
т.е. во время работы можно менять(добавлять) объект вывода.
как должен выглядеть прототип функции принимающей в качестве параметра указатель на объект поддерживающий << (например ostream, ofstream или что-то свое), без надобности все объекты наследовать от какого-то базового класса?

Выделить всёкод C++

    
void Str2Obj(string str, neponjatno4to* ptr)
{
   *prt << str;
}

или все же придется шаблон писать?


Во-первых, я предложил бы использовать общепринятый порядок аргументов для функций, реализующих действие оператора <<. То есть на первое место я поставил бы объект, в который записываются данные, а на второе место что записывается в данные. 
Во-вторых, вместо указателя на объект также по аналогии с объявлением функций, реализующих оператор <<, я бы передавал ссылку на объект и ее же возвращал из функции, чтобы можно было организовывать цепочку вызовов функции, например, в виде

Str2Ob( Str2Ob( ptr, str1 ),  str2 ):

А еще лучше эту функцию оформить в виде оператора-=функции <<.
PM MAIL   Вверх
xvr
Дата 18.7.2011, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(asmdzen @  18.7.2011,  11:22 Найти цитируемый пост)
как должен выглядеть прототип функции принимающей в качестве параметра указатель на объект поддерживающий << (например ostream, ofstream или что-то свое), без надобности все объекты наследовать от какого-то базового класса?

Шаблон, но реализации такого класса лога это не поможет (IMHO). Все равно что то общее должно быть (или у логеров, или у источников логов). В вашей оригинальной постановке задачи сделать такой логер невозможно (опять же IMHO)


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



**


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

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



Цитата(borisbn @  18.7.2011,  17:47 Найти цитируемый пост)
где держать ?

в объекте лога, т.е. держать специально для этого контейнер. за mem_fun спасибо.
Сыроежка, спасибо, буду иметь ввиду.

в общем получается не очень красиво, вызов функции log с форматирующей строкой возвращает ссылку на временный объект построенный на основе boost::format, в котором operator % заменил на operator <<,
при уничтожении этого объекта, его содержимое пишется в лог (передается как параметр всем функциям из контейнера по очереди). Не нравится то что постоянно создаются временные объекты.

применяю так:
Код

log("first %d, second %d") << x << y;


если у кого завалялся класс лога буду предельно признателен если поделитесь, исключительно в целях ознакомления. (pantheios и ему подобные просьба не предлагать, хочу понять как именно это следует писать)

Это сообщение отредактировал(а) asmdzen - 18.7.2011, 21:22
PM MAIL   Вверх
borisbn
Дата 19.7.2011, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(asmdzen @  18.7.2011,  21:21 Найти цитируемый пост)
в общем получается не очень красиво

Цитата(asmdzen @  18.7.2011,  21:21 Найти цитируемый пост)
log("first %d, second %d") << x << y;

IMHO вполне даже красиво... Не безопасно, но читабельно.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
asmdzen
Дата 19.7.2011, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



borisbn, не очень красиво в смысле 
Цитата(asmdzen @  18.7.2011,  21:21 Найти цитируемый пост)
 постоянно создаются временные объекты


PM MAIL   Вверх
borisbn
Дата 19.7.2011, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(asmdzen @  19.7.2011,  08:23 Найти цитируемый пост)
постоянно создаются временные объекты

Ну и что ? У тебя в конструкторе открытие БД или коннект с сервером ??? Если же открытие файла лога для дозаписи - так это правильно, надёжно. Потому, что если создать файл в начале, а закрыть в конце, то этого конца может и не быть, если программа рухнет.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
asmdzen
Дата 19.7.2011, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



Цитата(borisbn @  19.7.2011,  08:31 Найти цитируемый пост)
Если же открытие файла лога для дозаписи - так это правильно, надёжно.

такое я себе позволить не могу )
создаются временные объекты для сборки строки, при их удалении строка передается классу лога который и пишет это в файл.
программа критичная к ресурсам, если бы файл постоянно открывался/закрывался - это бы сильно все усложнило.
PM MAIL   Вверх
borisbn
Дата 19.7.2011, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(asmdzen @  19.7.2011,  09:00 Найти цитируемый пост)
такое я себе позволить не могу

Что ж это за лог, который в случае падения программы может не записать данные ? Как ты потом разберёшься из-за чего прога упала-то ?

Ну, смотри сам... Тебе виднее. Я б поискал потерю производительности в других местах, а лог бы сделал надёжным.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 19.7.2011, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(borisbn @  19.7.2011,  08:31 Найти цитируемый пост)
Потому, что если создать файл в начале, а закрыть в конце, то этого конца может и не быть, если программа рухнет. 

Это какой-то перерасход ресурсов. Проще воспользоваться: std::clog << std::flush;
PM   Вверх
asmdzen
Дата 19.7.2011, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



Цитата(borisbn @  19.7.2011,  08:31 Найти цитируемый пост)
 если создать файл в начале, а закрыть в конце, то этого конца может и не быть, если программа рухнет

я что-то не понимаю, что с того что программа рухнет? зачем мне закрывать файл вообще, разве это так важно, я просто записываю данные в файл, если прога рухнет - система сама закроет файл, перед этим делая flush, разве не так?
PM MAIL   Вверх
bsa
Дата 19.7.2011, 11:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(asmdzen @  19.7.2011,  11:23 Найти цитируемый пост)
перед этим делая flush, разве не так? 

не совсем так. есть разный уровень буферизации. При крахе программы система сохраняет только то, что было в ее буферах. А то что стандартная библиотека С или С++ использует свои, система не в курсе. Поэтому, после каждого полностью завершенного сообщения отправленного в файл нужно делать flush для него.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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