Как объявить глобальную переменную и обновлять ее в нескольких файлах/классах? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как объявить глобальную переменную и обновлять ее в нескольких файлах/классах? [закрыто]

Сообщение Anonymous »

Цель состоит в том, чтобы сохранить одинаковые настройки для всей моей программы.
Когда программа запускается, она должна прочитать некоторые текстовые файлы (отредактированные пользователем) и перезаписать соответствующие глобальные переменные. Неотредактированные файлы должны сохранять значения по умолчанию.
Сейчас я делаю это, используя два отдельных файла: Settings.h и DefaultSettings.h
В Settings.h:

Код: Выделить всё

#pragma once
#include 

namespace Settings {
extern int bits;
extern int k;
extern int nsym;

extern void apply_settings(std::string &name, std::string &value);
}
В DefaultSettings.h:

Код: Выделить всё

#pragma once
#include "Settings.h"
#include 
namespace Settings {
int bits = 8;
int k = 20;
int nsym = 12;

// Called one by one by the file reader
void apply_settings(std::string &name, std::string &value) {
if (name == "bits") {
bits = atoi(value.c_str());
} else if (name == "k") {
k = atoi(value.c_str());
} else if (name == "nsym") {
nsym = atoi(value.c_str());
}
}
}
Позже в программе, после прочтения и применения настроек, я создаю экземпляры класса и использую их следующим образом:

Код: Выделить всё

#pragma once
#include "Settings.h"

class RSCodec {
int bits, k, nsym;
public:
RSCodec();
virtual ~RSCodec();
};
И в файле cpp

Код: Выделить всё

#include "RSCodec.h"

RSCodec::RSCodec() {
bits = Settings::bits;
k = Settings::k;
nsym = Settings::nsym;

printf("BITS %d, K %d, NSYM %d\n", bits, k, nsym);
}

RSCodec::~RSCodec() {}
Всегда выводит значения по умолчанию вместо обновленных.
Некоторые другие классы вместо этого работают с обновленными значениями, но доступ к ним осуществляется в таким же образом (только разные пространства имен, например Settings::RF24::, Settings::DUAL_RF24:: и т. д.)
Минимальный пример:

Код: Выделить всё

#include 
using namespace std;

#include "DefaultSettings.h"
#include "RSCodec.h"

int main() {

string k = "k";
string nsym = "nsym";
string val = "10";

Settings::apply_settings(k, val);
Settings::apply_settings(nsym, val);

RSCodec* rsc = new RSCodec();

return 0;
}
В моей программе k по-прежнему будет значением по умолчанию (20), а не новым (10)

Подробнее здесь: https://stackoverflow.com/questions/785 ... iles-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»