4

我想要做的:每当要在程序中使用类的实例时,运行一些必备代码。此代码将检查 requiremts 等,并且应该只运行一次。

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

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

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

4

3 回答 3

6

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

如果您对此感到满意,您可能可以这样做,尽管游戏范围内的构造函数系统的可发现性为零(即,一旦您忘记了“技巧”或其他人尝试阅读您的代码,他们会对发生的事情感到困惑)。

于 2010-05-29T23:15:09.610 回答
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;
    }
};
于 2010-05-29T23:26:08.413 回答
1

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

于 2010-05-30T00:05:58.053 回答