构造一个静态成员变量

时间:2015-11-30 16:29:28

标签: c++ static static-members

我有一个类的静态成员,需要使用非默认构造函数构造。代码是这样的:

class MyClass
{
public:
   static void initialise(int arg1, int arg2)
   {
      static MyClass instance(arg1, arg2);
      _instance = instance;
   }

   static MyClass& instance()
   {
      return _instance;
   }

   /* Other non-static functions used with the return of instance()... */

private:
   MyClass(int arg1, int arg2)
      : _arg1(arg1), _arg2(arg2) {}

   static MyClass& _instance;
   int _arg1, _arg2;
};

我这样做是因为我需要在应用程序的生命周期中使用该类的一个实例,但是它需要使用仅在读取配置后才知道的参数构造。 MyClass的超类将调用MyClass中的覆盖,这取决于知道这些配置项。

我一直试图找到一种方法来声明一个静态的MyClass成员,它只是一个占位符,所以它可以在以后构建,但是我的测试看起来似乎不可能。测试如下:

#include <cstdio>

class CNoDefCtor
{
public:
    CNoDefCtor(int arg1)
        : _arg1(arg1)
    {
        printf("%s\n", __func__);
    }

    virtual ~CNoDefCtor()
    {
        printf("%s\n", __func__);
    }

    static void Initialise(int arg1)
    {
        printf("%s\n", __func__);
        CNoDefCtor _instance(arg1); /* Actually construct here?!? */
    }

    static CNoDefCtor& instance()
    {
        return _instance;
    }

    int Arg1()
    {
        return _arg1;
    }

private:
    int _arg1;
    static CNoDefCtor _instance;
};

int main()
{
    printf("%s\n", __func__);

    CNoDefCtor ndc; /* Placeholder? */
    ndc.Initialise(1);
    printf("%d\n", ndc.Instance().Arg1());

    printf("%s\n", __func__);
}

所以我想我的问题是:你如何声明但不构造一个静态成员?我认为如果它没有默认构造函数就可以。

请告诉我,我遗漏了一些简单的东西,并且有一种简单的方法可以做到这一点。

1 个答案:

答案 0 :(得分:1)

你要做的是经典的单身人士课程。 https://en.wikipedia.org/wiki/Singleton_pattern

您在第一个代码块中编写的类定义很好,应该可以工作。类静态对象将在第一次调用initialise()时初始化。

我认为问题在于您的测试代码,您不应该在main中使用占位符变量。这将创建你的单例类的一个对象,你显然不需要它。

因此,为了纠正你的单身人类,你必须在编写单身人士课时遵守以下规则,

  1. 私有的默认构造函数。
  2. 初始化函数是静态的。
  3. 类定义中的静态变量(实例)应该是指针或引用变量。
  4. 所以你的新测试类定义应该是,

    class CNoDefCtor : public CAnnoyingClass
    {
    private:
        CNoDefCtor(int arg1)
            : _arg1(arg1)
        {
            printf("%s\n", __func__);
        }
    
    public:
        virtual ~CNoDefCtor()
        {
            printf("%s\n", __func__);
        }
    
        static void Initialise(int arg1)
        {
            printf("%s\n", __func__);
            _instance = new CNoDefCtor(arg1);
        }
    
        static CNoDefCtor& instance()
        {
            return *_instance;
        }
    
        int Arg1()
        {
            return _arg1;
        }
    
    private:
        int _arg1;
        static CNoDefCtor *_instance;
    };
    
    int main()
    {
        printf("%s\n", __func__);
    
        CNoDefCtor::Initialise(1);
        printf("%d\n", CNoDefCtor::Instance().Arg1());
    
        printf("%s\n", __func__);
    }