【发布时间】:2011-01-23 08:24:49
【问题描述】:
我在久违了 C++ 之后又回到了 C++ 中,我对众所周知的静态初始化问题的理解有点磕磕绊绊。
假设我有一个简单的类 Vector2,如下所示(请注意,我知道 x 和 y 对于 getter 和 setter 应该是私有的,为简洁起见,这些已被省略):
class Vector2 {
public:
Vector2(float x, float y) :x(x), y(y) {};
float x,y;
}
现在,如果我想指定一个静态 const 成员来表示一个 Vector2,其中 x 和 y 设置为 1,我不确定如何进行 - 静态 const 成员会遇到静态初始化问题还是会发生以下行为让他们成为 const 意味着他们还好?我正在玩弄以下可能性:
可能性一:
// .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() 方法,我会冒崩溃和烧毁的风险吗?正如我所说,这是因为我使用的是静态 const 而不是普通静态,所以我在问这个问题,因为我在普通静态类成员问题上发现了很多,但在 const 静态问题上却一无所获。
我怀疑我使用 static const 并需要使用可能性 3 以确保安全这一事实没有任何收获,但我只是想问一下,以防有人可以为我阐明这一点。
我意识到我可能正在向大量指向我所要求的链接的链接敞开大门,但在发布之前我已经查看并没有找到。
任何帮助将不胜感激。
【问题讨论】:
-
您的问题并不完全清楚,但如果您尝试从 另一个静态初始化程序 直接与否。在调用 main() 之后从另一个静态函数访问它是可以的
-
感谢您的评论 sbk。我的问题应该更清楚一点。我的目的是确保在单独的 cpp 文件中的另一个类中的静态初始化程序中使用静态成员是安全的。尽管我的其他类目前没有一个专门使用 Vector2::getOne() 来初始化另一个静态成员,但我确实遇到了存在静态初始化器链的情况。我选择 Vector2 作为一个简单的例子,这样我就可以从这里的 cmets 中了解在我的整个项目中推广的最佳模式。非常感谢您的评论。
标签: c++ static initialization constants