Везде, абсолютно везде пишут что глобальные переменные, объекты это плохо и очень плохо.
Но нигде нормального ответа как обходится без них я не нашел. На форуме искал.
Допустим есть класс Log, который инициализируется при старте программы гдето в самом начале main().
И есть другие части программы которые работают в разных потоках, там тоже используется Log.
Как я понял это как раз случай для синглетона:
// other_module.cpp
auto g_log = Log::instance();
*g_log << loglevel::info << "some text";
// other_module2.cpp
auto g_log = Log::instance();
*g_log << loglevel::info << "some text2";
Все вроде идеально, но тут будет ошибка линкования.
Другой рабочий вариант это через
extern:
// main.hpp
std::shared_ptr<Log> g_log = nullptr;
// main.cpp
#include "main.hpp"
g_log = std::make_shared<Log>();
// other_module.cpp
extern std::shared_ptr<Log> log;
но опять таки, много где пишут мол старайтесь избегать
extern. А что использовать взамен тогда???
Как правильно спроектированные приложения решают проблему глобальных данных?
Какие книги есть по данной тематике (а именно физический дизайн приложения), где бы описывалось как правильно строить программу.
Спасибо