【发布时间】:2013-03-06 16:31:03
【问题描述】:
最近一位同事给我看了这样的代码:
void SomeClass::function()
{
static bool init = false;
if (!init)
{
// hundreds of lines of ugly code
}
init = true;
}
他想检查SomeClass 是否已初始化,以便在每个Someclass 实例中执行一次代码,但事实是,在程序的整个生命周期中只有一个SomeClass 实例存在。
他的问题是关于init 静态变量,关于它的初始化时间。我已经回答说初始化发生了一次,所以在第一次调用时该值将是false,而在它的剩余生命周期中将是true。回答后,我补充说这种使用静态变量是不好的做法,但我无法解释原因。
到目前为止我一直在思考的原因如下:
-
static bool init到SomeClass::function的行为可以通过非静态成员变量来实现。 -
SomeClass中的其他函数无法检查static bool init值,因为它的可见性仅限于void SomeClass::function()范围。 - 静态变量不是OOPish,因为它们定义的是全局状态而不是对象状态。
这个原因对我来说看起来很糟糕、不聪明而且不是很具体,所以我要求更多的理由来解释为什么在函数和成员函数空间中使用静态变量是一种不好的做法。
谢谢!
【问题讨论】:
-
The behaviour of static bool init into SomeClass::function could be achieved with a non-static member variable.怎么样?如果它是非静态的,if (!init) {}之间的代码将在每个实例中调用一次。 -
@LuchianGrigore 我的错,我同事的代码缺少一些信息,他想检查
SomeClass的每个实例的初始化状态,而不是每个类检查一次,由于SomeClass在所有程序中只有一个实例,我认为最好创建一个IsInitialized非静态成员值。我最好编辑文本以澄清这一点。