LINUX.ORG.RU

[C++][Qt] Хранение и манипулирование глобальными переменными

 ,


0

2

Необходимость возникла при хранении глобальных переменных в приложении, которые считываются из конфигурационного файла. Есть желание хранить их в словаре/хэш-таблице. Что-то вроде этого:

enum {SERVER, LOGIN, PASSWORD}
QString server = vars.value(SERVER);
QString login = vars.value(LOGIN);
QString password = vars.value(PASSWORD);

Вроде бы обычного enum должно хватить. Однако, подводные камни всегда есть. Чтобы уменьшить количество однообразного кода, хочется записывать и читать переменные так:

settings.setValue(PASSWORD, vars.value(PASSWORD));
vars.insert(PASSWORD, settings.value(PASSWORD, "").toString());

И в таком случае в конфигурационном файле будет нечитаемая каша.

Как варианты - конвертировать enums в строку, но это делается просто таки монструозными конструкциями, или составлять ещё один словарь enum<->строка, но это же глупо и по-индусски!

Вариант с использованием QSettings в GUI не подходит, так как вся логика вынесена в core, и core содержит интерфейсы для GUI, который может быть разнообразным, и, соответственно, про QSettings ничего не знать. Пока лучшим вариантом обмена переменными между core и GUI - опять же словарь. Не писать же в core::getSetting(QMap<key, value>)так:

    if(map.contains("db_host"))
        DB_HOST = map.value("db_host");
    if(map.contains("db_user"))
        DB_USER = map.value("db_user");
    if(map.contains("db_password"))
        DB_PASSWORD = map.value("db_password");

Суть вопроса - как наиболее изящно организовать хранение глобальных переменных?

Поделитесь рецептами и идеями.

★★★★★

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

В Qt же есть специальный класс для хранения конфигураций? QSettings или что-то вроде того…

KblCb ★★★★★
()
enum {SERVER, LOGIN, PASSWORD}
QString server = vars.value(SERVER);
QString login = vars.value(LOGIN);
QString password = vars.value(PASSWORD);

Это переизобретение структур?

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

Если использовать структуру, то как тогда получить имя переменной?

QString password = vars.password;//Отлично, получение переменной просто замечательное

keyPassword = ??? //туда надо занести название самой переменной, т.е. "password", однако, как это сделать?

Подобная проблема в словаре отсутствует в принципе.

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

> Вариант с использованием QSettings в GUI не подходит, так как вся логика вынесена в core, и core содержит интерфейсы для GUI, который может быть разнообразным, и, соответственно, про QSettings ничего не знать. Пока лучшим вариантом обмена переменными между core и GUI - опять же словарь.

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

Т.е., QSettings используется в самом ядре программы. А надо ещё сопоставлять ключи-строки для QSettings и ключи-enum для передавания словаря переменных через интерфейсы.

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

Надстроку сделать.

Хотя я вроде не понял, что ты хочешь сначала. Но что-то туплю в чем-=то

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

Подобная проблема в словаре отсутствует в принципе.

Да? А перевод в строку?

Вообще препроцессор в помощь, для формирования из одного макроса определения структуры и сохранения/восстановления в/из QSettings. И особенно в помощь операция препроцессора # (перевод аргумента макроса в строку).

Begemoth ★★★★★
()

Сделать свой (core::)Settings на основе QSettings с нужным тебе интерфейсом ({get,set}Password(), {get,set}Host(), ...), забив на enum'ы.

anonymous
()

Может быть у меня странные взгляды, но ИМХО если у тебя есть необходимость использования глобальных переменных - то ты что-то делаешь не так.

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

ЕМНИП, оно будет QVariant? Не, плохая идея. Я за строгую типизацию. А то потом при каждом использовании есть ненулевая вероятность случайно ошибиться с типом и огребти багов.

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

> Ок, а как хранить настройки приложения, особенно, когда GUI отделен от логики?

Сделать над-класс-родитель над гуем и логикой?

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