Итак, у меня есть класс со статическими переменными, причина в том, что они статичны для (хотя это может показаться незначительным) эффективности (требуется только однажды загрузить, уменьшить избыточность памяти в том же файле).
В любом случае, что я хотел бы знать, есть ли способ проверить, была ли загружена переменная?
Или есть способ получить конкретный конструктор, называемый при первом создании экземпляра этого класса, а другой — при наличии других экземпляров?
Если ни один из них не подходит, каково решение?
Если ваши статические члены являются частными и инициализируются в том же модуле перевода, что и все функции-члены вашего класса, тогда стандарт гарантирует, что статические члены будут инициализированы до их использования. Увидеть: Когда инициализируются статические члены класса C ++?
В других ситуациях эта гарантия вам не помогает (например, доступ к не приватным статическим элементам из другого модуля перевода или из встроенных функций-членов).
Вы можете играть в игры с isInitialized
флаги, но имейте в виду, что без дальнейшей работы это не потокобезопасно.
В FAQ по C ++ рекомендуется заключать экземпляры статических классов в функции, что гарантирует их инициализацию при первом использовании. например.:
Fred& x()
{
static Fred* ans = new Fred();
return *ans;
}
Источник: https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use
Ну вот:
class Test {
static bool isInitialized;
public:
Test() {
if (!isInitialized) {
// do whatever you need here
// ...
isInitialized = true;
}
}
};
bool Test::isInitialized = false;
Вы можете сделать что-то вроде:
struct StaticData
{
// some variables
};
class YourClass
{
public:
YourClass(/*..*/) {
if (staticData == nullptr) {
staticData = std::make_unique<StaticData>(/*..*/)
}
}
private:
static std::unique_ptr<StaticData> staticData;
};
static std::unique_ptr<StaticData> YourClass::staticData;