Как наиболее корректно работать с глобальными данными
От: lnkuser  
Дата: 03.07.15 08:36
Оценка:
Везде, абсолютно везде пишут что глобальные переменные, объекты это плохо и очень плохо.
Но нигде нормального ответа как обходится без них я не нашел. На форуме искал.

Допустим есть класс 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. А что использовать взамен тогда???
Как правильно спроектированные приложения решают проблему глобальных данных?


Какие книги есть по данной тематике (а именно физический дизайн приложения), где бы описывалось как правильно строить программу.


Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.