Здравствуйте, lnkuser, Вы писали:
L>Везде, абсолютно везде пишут что глобальные переменные, объекты это плохо и очень плохо.
А ещё пишут что
goto и
friend это плохо. Некоторые даже считают что обычные функции это плохо, и всё должно быть классом/объектом
Я практически для всего что фанатики называют considered harmful видел достойные применения.
L>Но нигде нормального ответа как обходится без них я не нашел. На форуме искал.
Если пытаться без них совсем по-честному, то нужно в каждую функцию использующую глобальное состояние передавать дополнительные параметры — плюсом здесь является чуть более простая кастомизация. Но в случае логирования это редко оправданно.
Как правило же используют те же самые глобальные объекты, но замаскированные под какими-нибудь buzzwords типа ServiceLocator или IoC-Container.
L>Все вроде идеально, но тут будет ошибка линкования.
Тема хорошо раскрыта в Modern C++ Design Александреску.
Один из простых вариантов — это так называемый Meyers Singleton:
// in header:
inline Log &log()
{
static Log x;
return x;
}