Я возвращаюсь в C ++ после долгого отсутствия и немного спотыкаюсь о своем понимании довольно известной проблемы статической инициализации.
Допустим, у меня есть простой класс Vector2, как указано ниже (обратите внимание, что я знаю, что x и y должны быть частными с геттерами и сеттерами, они просто опущены для краткости):
class Vector2 {
public:
Vector2(float x, float y) :x(x), y(y) {};
float x,y;
}
Теперь, если я хочу указать статический член const для представления Vector2 с x и y, установленным в 1, я не уверен в том, как поступить - будут ли статические члены const нарушать проблему статической инициализации или будет действовать сделать их const означает, что они в порядке? Я играю со следующими возможностями:
Возможность 1:
// .h
class Vector2 {
public:
Vector2(float x, float y) :x(x), y(y) {}
static const Vector2 ONE;
float x,y;
};
// .cpp
const Vector2 Vector2::ONE = Vector2(1.f, 1.f);
Возможность 2:
// .h
class Vector2 {
public:
Vector2(float x, float y) :x(x), y(y) {}
static const Vector2& getOne();
float x,y;
private:
static const Vector2 ONE;
};
// .cpp
const Vector2 Vector2::ONE = Vector2(1.f, 1.f);
static const Vector2& Vector2::getOne() {
return ONE;
}
Возможность 3:
// .h
class Vector2 {
public:
Vector2(float x, float y) :x(x), y(y) {}
static const Vector2& getOne();
float x,y;
};
// .cpp
const Vector2& Vector2::getOne() {
static Vector2 one(1.f,1.f);
return one;
}
Теперь я предпочел бы написать это так, как в варианте 2, просто потому, что для меня это более удобный синтаксис. Однако, если я вызову метод getOne () из другого статического метода в другом классе, могу ли я рискнуть потерпеть крах и записать? Как я уже сказал, именно потому, что я использую статический констант, а не простую статическую, я задаю этот вопрос, так как я нашел много вопросов о простых статических членах класса, но ничего о константных статических проблемах.
Я подозреваю, что ничего не выиграю из-за того, что я использую статический констант, и мне нужно перейти с возможностью 3, чтобы быть в безопасности, но я просто хочу спросить, может ли кто-нибудь пролить свет на это для меня.
Я понимаю, что, вероятно, открываю себя множеству ссылок, указывающих именно на то, что я прошу, но я посмотрел и не нашел, прежде чем опубликовать это.
Буду признателен за любую помощь.