У нас есть реализация журнала, основанная на std :: ostream с настраиваемым буфером потока. Мы реализуем экземпляр нашего приложения класса журнала через счетчик Schwarz.Наследование от класса C++ без виртуальных функций
Чтобы избежать связывания наших классов нижнего уровня с нашей реализацией журнала, мы можем передать ссылку на std :: ostream. Таким образом, наши классы нижнего уровня могут входить в std :: cout, std :: cerr или в экземпляр, созданный с помощью счетчика Schwarz.
У меня есть одна проблема с этим. Реализация журнала устанавливает его серьезность через перегрузку оператора потока:
// Overload the << operator to set the log message severity
inline CLogStream& operator << (CLogStream& myLogStream, eMsgType::type msgTypeCurrent)
{
myLogStream.SetMsgTypeCurrent(msgTypeCurrent);
return (myLogStream) ;
}
Это позволяет использовать регистратор как это:
CLog::Main << CLog::MSG_FATAL << "Fatal error" << std::endl;
Я хотел бы создать ссылку на экземпляр нашего приложения журнала, который заблокирован для конкретной серьезности. Таким образом, я могу передать нашим классам утилиты две ссылки std :: ostream. Один из них будет использоваться для обычной отчетности, а другой для сообщений об ошибках. Они могут быть установлены в std :: cout и std :: cerr или на какой-то объект, ссылающийся на наш экземпляр объекта журнала.
К сожалению, оператор std :: ostream < < не является виртуальным, насколько я знаю, поэтому я не уверен, как создать такой объект.
Любые мысли?
Если 'SetMsgTypeCurrent' не является' virtual' (т. Е. 'CLogStream' не предназначен для наследования), тогда это сложно. – Jon
@Jon: Я могу изменить определение SetMsgTypeCurrent, поэтому может сделать его виртуальным, если это поможет. Но мне нужно получить доступ к классу через std :: ostream, поэтому я не вижу, какие параметры могли бы дать мне. Единственные виртуальные функции, о которых я знаю, находятся в std :: streambuf, и ни одна из них не кажется полезной для этой цели. –
Не ответ, но: я вижу и другие проблемы с этим дизайном. В частности, он не является потокобезопасным: другой поток может вмешиваться между «<< CLog :: MSG_FATAL» и «<<» фатальной ошибкой ». Меняет дизайн полностью вариант? – jogojapan