我想做什么:每当要在程序中使用类的实例时运行一些先决条件代码。 此代码将检查要求等,并且只应运行一次。

我发现这可以使用另一个对象作为构造函数内的静态变量来实现。 这是一个更好的图片示例:

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;
         }
};

困扰我的是,到目前为止我还没有看到类似的静态变量。 是否有任何缺点或副作用或我遗失了什么? 或者也许有更好的解决方案? 欢迎任何建议。

#1楼 票数:6 已采纳

这不是线程安全的,因为如果两个线程同时第一次尝试构造C,则先决条件可能会初始化两次。

如果你对此没问题,你可以做到这一点,虽然游戏范围内的构造函数系统没有可发现性(即一旦你忘记了'技巧'或其他人试图阅读你的代码,他们会感到困惑的是发生了什么)。

#2楼 票数:4

是否有任何缺点或副作用或我遗失了什么? 或者也许有更好的解决方案? 欢迎任何建议。

显式调用静态方法可能更清楚(尽管更详细)。

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;
    }
};

#3楼 票数:1

您至少应该在Prerequisites类中使用互斥锁和静态标志来再次保护先决条件对象的多次初始化。 这样,您的代码将变为线程安全。

  ask by doc translate from so

未解决问题?本站智能推荐:

2回复

C++:在构造函数中定义的静态变量

我很好奇这里“幕后”真正发生了什么。 我正在创建一个具有在调用构造函数时自动分配的 ID 变量的类,具体取决于过去创建的实例数量。 班级: 主要: 我只习惯于使用在全局范围内初始化的静态成员变量(即 MyClass::staticVariable = 1),所以这个“类内”初始化让我感到困
2回复

在静态变量的构造函数中检索静态const变量的值

我知道下面的代码将导致分段错误,因为在A的cstr处,B :: SYMBOL尚未初始化。 但为什么? 实际上,A是一个对象,用作将B之类的符号映射到其各自ID的映射。 C静态地保留此map(A),以便它可以将映射作为类函数提供。 A的主要功能是充当C的映射,该映射在启动时进行初始
4回复

Python实例化类定义中的类

我试图将一个变量添加到一个类,该类保存类的实例。 以下是我的代码的缩短版本。 运行代码后,我收到以下错误。 是否有另一种方法可以将类的实例添加到该类中的类/静态变量中?
1回复

共享库中静态变量的构造方法

我很好奇在共享库中实例化的静态变量是否完全实例化。 首先,下面是代码: AClass.h MyLib.cpp 因此,使用此代码加上Main.cpp文件(除了一个空的main函数之外,什么都没有),我想让构造函数通过MyLib.cpp内变量的初始化来调用。 我将MyL
1回复

C ++静态变量初始化顺序

1)如果我没有弄错,C ++标准保证单个翻译单元中的静态变量按其定义顺序初始化。 我对以下代码片段感到困惑: extern int n; 是声明,而不是定义,因此k在n之前定义,但是GCC,Clang和MSVC都在全局变量初始化后向我显示k == 2 。 对我来说,目前还不清楚在in
3回复

如何在继承的类上初始化静态变量?

我正在尝试创建一个“父”类,它为所有它继承的类提供了一个通用的构造函数和参数类型。 继承的唯一变化是一些静态变量的值。 实现这一目标的最佳方法是什么? 这是我目前的尝试: 我的问题是:我无法在TenisBall和OtherBall类上设置静态值,如果我在最后两行代码中更改了Te
2回复

重新分配静态变量如何工作?

由于静态变量的生命周期是程序的生命周期,当您尝试重新分配它时究竟会发生什么? 在下面的程序中, test.loc在被销毁之前最终变成了 6,即使构造函数是唯一可以改变该值的东西。 它是原始对象本身,那么它的成员变量之一如何更改? 输出:
1回复

定义静态成员变量时为什么不遵循定义顺序?

我知道来自不同翻译单元的静态变量的初始化顺序问题。 但是,我的问题是在一个翻译单元内,实际上是在一个结构内: 输出为: 令我惊讶的是, computeAllMDDeltas在computeAllActions之前被调用,因此,在computeAllMDDeltas使用allAc