Почему глобально определяемая статическая переменная сбрасывается?

Мой код очень большой, но я постараюсь максимально сократить его здесь.

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

Мой define.h включен везде, так что там я определил.

static std::string MAINLOG = "RANDOMNES";

В моей основной функции я делаю:

for (int i = 0; i < files.size(); i++){

// Do stuff

prepDbugDir();  // This sets MAINLOG to "CORRECT_VALUE"
std::cout << "Before " << MAINLOG << std::endl;

// Call a class function whose includes include my defines.h

std::cout << "After " << MAINLOG << std::endl;}

И распечатка из моего файла

Before CORRECT_VALUE
RANDOMNESS
After CORRECT_VALUE

Итак, мой вопрос: почему и как я могу получить ценность, которая будет поддерживаться в моих классах.

5

Решение

Каждая единица перевода (файл .c или .cpp, в основном), которая включает defines.h будет иметь свою собственную копию переменной.

Я считаю, что объявление глобального extern в шапке

extern std::string MAINLOG;

а затем определить его как нестатическую глобальную переменную в любом один файлов .c или .cpp

std::string MAINLOG = "RANDOMNES";

решит проблему. Но это плохой стиль кодирования, ИМО. Путь C ++ был бы как минимум одноэлементным классом.

Я не могу дать значимые имена, не зная контекста, но идея заключается в следующем:

mainlog.h

class Mainlog {
Mainlog() = default; // Private default constructor

static Mainlog& instance();

public:
static const std::string& get() {
return instance().value;
}

static void set(const std::string& newValue) {
instance().value = newValue;
}

private:
std::string value {"RANDOMNESS"};
};

mainlog.cpp (не помещайте это в заголовок!)

Mainlog& Mainlog::instance() {
static Mainlog mainlog;
return mainlog;
}
5

Другие решения

Вот что я бы порекомендовал.

В define.h:

const std::string& mainlog();

В main.cpp:

const std::string& mainlog() {
static std::string MAINLOG = "CORRECT_VALUE";
return MAINLOG;
}
3

Поскольку вы помещаете его в свой файл define.h, который затем включаете в свои файлы .cpp, каждый файл .cpp получает свой собственный экземпляр строки, видимый только внутри этого файла .cpp. static делает переменную видимой только внутри .cpp, где она объявлена.

Измените static на extern в вашем define.h, например так:

extern std::string MAINLOG;

Затем в один и только один из ваших .cpp файлов добавьте это:

std :: string MAINLOG = «RANDOMNES»;

Это даст вам ожидаемое поведение, но такие глобальные переменные являются ПЛОХОЙ идеей.

1

Когда вы определяете переменную со статическим хранилищем в заголовке, каждый перевод получает свою уникальную переменную с этим именем.

Простое исправление, если вы не хотите идти в одиночку, это объявить

extern const std::string& MAINLOG;

в вашем заголовке, а затем основной файл определяет

std::string MAINLOG_INTERNAL = "RANDOMNESS";
const std::string& MAINLOG = MAINLOG_INTERNAL;

Это даст вам доступную для записи строку, которая будет иметь вид «только для чтения» в остальной части программы.

Тогда ты можешь

void prepDbugDir()
{
MAINLOG_INTERNAL = "CORRECTNESS";
}

в основном файле.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector