构造函数内部的静态变量,是否有缺点或副作用?
-
05-10-2019 - |
题
我想做的是:每当课程中使用课程的实例时,请运行一些先决条件。此代码将检查需求等,并且应仅运行一次。
我发现可以使用另一个对象作为构造函数内部的静态变量来实现这一目标。这是一个更好图片的示例:
class Prerequisites
{
public:
Prerequisites() {
std::cout << "checking requirements of C, ";
std::cout << "registering C in dictionary, etc." << std::endl;
}
};
class C
{
public:
C() {
static Prerequisites prerequisites;
std::cout << "normal initialization of C object" << std::endl;
}
};
令我困扰的是,到目前为止,我还没有看到类似的静态变量使用。有没有缺点或副作用,还是我缺少一些东西?也许有更好的解决方案?欢迎任何建议。
解决方案
这不是线程安全,因为如果两个线程尝试同时首次构造C,则可能会两次初始化先决条件。
如果您对此感到满意,则可以做到这一点,尽管游戏范围构造函数系统的发现性为零(即一旦您忘记了“技巧”或其他人尝试阅读您的代码,他们会感到困惑)。
其他提示
有没有缺点或副作用,还是我缺少一些东西?也许有更好的解决方案?欢迎任何建议。
显式调用静态方法可能更清楚(尽管更详细)。
class Prerequisites
{
static bool checkedOnce;
public:
static void checkOnce() {
if (checkedOnce)
{
//already checked: don't check again
return;
}
//else check them now
checkedOnce = true;
std::cout << "checking requirements of C, ";
std::cout << "registering C in dictionary, etc." << std::endl;
}
};
bool Prerequisites::checkedOnce = false;
class C
{
public:
C() {
Prerequisites::checkOnce();
std::cout << "normal initialization of C object" << std::endl;
}
};
您至少应该在先决条件类中使用静音和静态标志来保护先决条件对象的多次初始化。这样,您的代码将变得安全。
不隶属于 StackOverflow