关于visual c ++:如何在C ++ / CX中创建Singleton?

How to create a Singleton in C++/CX?

如何在C++/CX中创建一个单独的类?


首先,考虑一下你是否真的需要单身。

在C++和CX中实现单体与普通C++没有什么区别。您需要做两件事:(1)防止构造多个实例;(2)提供对对象的单个全局实例的访问。

下面是一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace Component
{
    public ref class Singleton sealed
    {
    public:

        static property Singleton^ Instance
        {
            Singleton^ get()
            {
                static Singleton^ instance = ref new Singleton();
                return instance;
            }
        }

    private:

        Singleton() { }
    };
}

我为singleton实例使用了一个局部静态变量,以避免命名空间范围的静态初始化排序问题。Visual C++还不支持C++ 11的线程安全静态初始化,所以如果您可以使用多个线程中的单个实例,或者您将考虑使用命名空间范围静态变量,并通过任何可能的初始化排序问题,或者需要研究同步初始化。


我这样做的方法是将指向singleton类的指针的静态变量初始化为空,并使用私有构造函数。然后使用静态create(…)方法来构建实例。在静态创建方法中,检查静态变量,仅当其为空时生成实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Foo
{
  public:
    Foo* Create();
  private:
    Foo(); //private ctor
    static Foo* M_ClassDataP;
};

Foo* Foo::M_ClassDataP = NULL; //initialize class data ptr to null

Foo* Foo::Create()
{
    if (NULL != M_ClassDataP)
    {
        M_ClassDataP = new Foo();
    }
    return M_ClassDataP;
}