LINUX.ORG.RU

Перегрузка оператора вывода в поток

 ,


0

1

Пишу свой логгер, работающий со всем подряд (позволяющий выводить логи куда угодно) есть желание писать так:

CMyLogger logger;
logger << "message" << 007 << "any message";

Для этого пытаюсь перегрузить оператор вывода в поток:

#include <iostream>

class CClass {
public:
	int i;
	
	CClass() { i = 55;}

	void operator<<(int inttt) {
		std::cout << " [" << inttt << "] " << std::endl;
	}
	
};

int main(int argc, char **argv)
{
	CClass clss;

	clss << 535 << 44;


	return 0;
}

Выдает ошибку

g++ oper.cpp -o oper
oper.cpp: In function 'int main(int, char**)':
oper.cpp:25:17: error: invalid operands of types 'void' and 'int' to binary 'operator<<'
  clss << 535 << 44;

При этом, если написать просто

clss << 535;
, то спокойно компилируется и работает.


Исправь на:

CClass & operator<<(int inttt) {

А вообще советуют его friend функцией делать. Может сейчас кто-нибудь пояснит, почему )

UVV ★★★★★ ()
Последнее исправление: UVV (всего исправлений: 1)
Ответ на: комментарий от UVV

О, взлетело, спасибо! Всё понятно.

Держу в руках бумажного Страуструпа, и туплю...

11.5.2 - Функция должна быть членом, если нет специфических причин для того, чтобы она им не была
JANB ()
Ответ на: комментарий от anonymous

Понятно. Оператор «<<» применяется слева направо, верно?

Просто сами по себе скобки путают, они как бы показывают направление =)

JANB ()
Ответ на: комментарий от UVV

почему

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

i-rinat ★★★★★ ()
Ответ на: комментарий от JANB

Считай << перенаправлением данных в поток, а >> из потока. Проще будет запомнить.

peregrine ★★★★★ ()
Ответ на: комментарий от peregrine

а почему это плохо, в данном случае? тьфу, если функция дружественная (а не метод), то доступ к приватным полям класса всё равно останется.

next_time ★★★★★ ()
Последнее исправление: next_time (всего исправлений: 1)

Парень

void operator<<(int inttt)

заставит тебя перегружать оператор вывода для всех типов, надо эзать шаблоны, вот тебе работающий логер logging.h и logger.cpp

Использую так

LogManager      *lg = LogManager::get_logging();
Formatter       *f = new Formatter("[TIME] [LEVEL:10] [NAME:15] [SESSION:10]    [MESSAGE]");
ConsoleHandler  *ch = new ConsoleHandler();
FileHandler     *fh = new FileHandler(log_file_path.toStdString());

f -> set_time_format("%Y-%m-%d %H:%M:%S,");
ch -> set_formatter(f);
fh -> set_formatter(f);
lg -> add_handler(ch);
lg -> add_handler(fh);

Logger *log = LogManager::get_logging() -> get_logger("UpdateManager");
log -> set_param("SESSION", "None");

log -> debug() << 123 << "123" << 4.5 << '\n';Logger
log -> info() << 123 << "123" << 4.5 << '\n';Logger
log -> warning() << 123 << "123" << 4.5 << '\n';Logger
log -> error() << 123 << "123" << 4.5 << '\n';Logger
log -> critical() << 123 << "123" << 4.5 << '\n';Logger

Для сборки нужен флаг -std=c++11

зы: На гениальность кода не претендую, код привел для помощи ТСу в собственной разработке... У меня данный код работает в продашене, все норм, проблем с падением производительности не наблюдаю

energyclab ()
Последнее исправление: energyclab (всего исправлений: 4)
Ответ на: комментарий от energyclab

Это была функция инициализации логера. Дале в любом другом классе достаточно сделать так

Logger *log = LogManager::get_logging() -> get_logger("Network");



И у него будет свой логер, через который можно логировать...
Забыл добавить, что '\n' в конце - это аналог std::endl, для освобождения буфера
energyclab ()
Последнее исправление: energyclab (всего исправлений: 1)
Ответ на: комментарий от energyclab

Спасибо!

Код помог.

Я разобрался и свой уже написал - отнаследовался от std::ostream и дописал для него std::streambuf. А поскольку наследуемся от ostream, оператор вывода в поток я вообще не трогал.

И обошелся без шаблонов.

Еще раз спасибо!

JANB ()
Ответ на: комментарий от energyclab

std::ios::sync_with_stdio(false);

Хм, и правда так быстрее...

JANB ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.