Сделайте Access
таким (и удалите FirstTime
и if
):
static MyStruct Access = Implementation(this_b);
Причина, по которой вы получаете это предупреждение, состоит в том, что статические переменные переживают один вызов функции. Их значение сохраняется во всех вызовах функций ( без в зависимости от того, какой поток вызывает эту функцию). Таким образом, FirstTime
будет контролировать инициализацию Access
. При первом вызове функции, в которой находится код, будет правильно инициализирована переменная Access
. Но при каждом последующем вызове функции FirstTime
равен нулю, и вы не больше не инициализируете Access
и, следовательно, будете использовать неинициализированную переменную в коде.
Редактировать: Теперь, с вашей обновленной информацией, вы говорите, что у вас есть две Implementation
функции. Первый раз, когда вы хотите использовать одну, а все остальные раз вы хотите использовать другую функцию. Как насчет этого тогда:
// static will be false/zero by default
static bool AlreadyCalled;
MyStruct Access;
if (!AlreadyCalled) {
Access = Implementation();
AlreadyCalled = true;
} else {
Access = Implementation2();
}
В зависимости от вашего фактического варианта использования, однако, могут быть лучшие способы справиться с этим. Например, почему бы не обновить состояние Access
, например:
// let the default constructor initialize it
// to a plausible state
static MyStruct Access;
// use RAII to update the state of Access when this
// function returns.
MyUpdater updater(Access);
// now, do whatever the function does.
Примерно так: MyUpdater
:
struct MyUpdater {
MyStruct &s;
MyUpdater(MyStruct &s):s(s) { }
~MyUpdater() {
s.ChangeState();
}
};
Этот шаблон называется RAII
: вы связываете некоторые полезные действия с конструктором и деструктором локально размещенного объекта.