Мне не очень нравятся static
члены данных, проблема инициализации стоит на первом месте.
Всякий раз, когда мне нужно выполнить значительную обработку, я обманываю и вместо этого использую локальный static
:
class MyClass
{
public:
static const SomeOtherClass& myVariable();
};
const SomeOtherClass& MyClass::myVariable()
{
static const SomeOtherClass MyVariable(someOtherFunction());
return MyVariable;
}
Таким образом, исключение будет выброшено только при первом использовании, и все же объект будет const
.
Это довольно мощный способ задержать выполнение. У него были небольшие накладные расходы (в основном компилятор проверяет флаг каждый раз, когда входит в метод), но лучше сначала позаботиться о корректности;)
Если это вызывается из нескольких потоков:
- если ваш компилятор с этим справится, прекрасно
- если ваш компилятор этого не делает, вы можете использовать локальное хранилище потоков (в любом случае, это const)
- вы можете использовать
boost::once
в библиотеке Boost.Threads
- , поскольку оно
const
, вам может быть все равно, если оно будет инициализировано несколько раз, если someOtherFunction
не поддерживает параллельное выполнение (остерегайтесь ресурсов)
Рекомендация : используйте static
или global
создание переменных только для простых объектов (которые не могут выбрасывать), в противном случае используйте local static
переменные для задержки выполнения до тех пор, пока вы не сможете перехватить возникающие исключения.