Я знаю, что существуют только реальные гарантии того, когда статическая переменная инициализируется. Самое главное (для меня), которое не гарантируется, - это порядок инициализации переменных в разных единицах компиляции, что вызвало следующий вопрос.getInstance - Class vs Method static
Я всегда писал свои одноэлементные классы, как это:
class A {
...
public:
static std::shared_ptr<A> getInstance();
private:
static std::shared_ptr<A> _instance;
}
== A.cpp ==
std::shared_ptr<A> A::getInstance() {
if(!_instance)
_instance = std::make_shared<A>();
return _instance;
}
Однако, насколько я понимаю, это не гарантирует, что экземпляр уже инициализирован (и, следовательно, вызов оператор BOOL действует), если я вызываю эту функцию в конструкторе любого другого статического объекта (который может произойти в некоторых редких случаях до запуска основного запуска).
Моя новая идея заключается в следующем:
class A {
...
public:
static std::shared_ptr<A> getInstance();
}
== A.cpp ==
A& A::getInstance() {
static std::shared_ptr<A> _instance = std::make_shared<A>();
return _instance;
}
на мой взгляд, это не только чище, но и лучший код, потому что теперь у меня есть гарантированный порядок инициализации.
Являются ли мои предположения правильными?
Поскольку вы знаете, что '_instance' гарантированно будет инициализирован при первом вызове' getInstance', почему вам все еще нужно заявление 'if'? – Nard
Потому что _instance не имеет значения. По умолчанию инициализация std :: shared_ptr хранит в ней нулевой указатель. – Thalhammer
Если да, почему бы не инициализировать 'shared_ptr' с' новым A' сразу? – Nard