2

如何在 C++/CX 中创建单例类?

4

2 回答 2

5

首先,考虑你是否真的需要一个单例。

与普通 C++ 相比,在 C++/CX 中实现单例的方式没有真正的区别。您需要做两件事:(1) 防止构造多个实例,以及 (2) 提供对对象的单个全局实例的访问。

这是一个简单的例子:

namespace Component
{
    public ref class Singleton sealed
    {
    public:

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

    private:

        Singleton() { }
    };
}

我为单例实例使用了一个局部静态变量,以避免命名空间范围的静态初始化排序问题。Visual C++ 尚不支持 C++11 的线程安全静态初始化,因此如果您可能正在使用来自多个线程的单个实例,那么您将需要考虑使用命名空间范围的静态变量并处理任何潜在的初始化顺序问题,或者您需要调查同步初始化

于 2012-05-22T17:50:13.830 回答
0

我这样做的方法是有一个静态变量,用于指向初始化为 NULL 的单例类的指针和一个私有构造函数。然后使用静态 Create(...) 方法来构建实例。在静态 Create 方法中检查静态变量并仅在其为 NULL 时构建实例

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;
}
于 2012-05-22T02:08:38.493 回答