【问题标题】:How to create a Singleton in C++/CX?如何在 C++/CX 中创建单例?
【发布时间】:2012-05-28 12:27:26
【问题描述】:

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

【问题讨论】:

  • @DirkEddelbuettel - OP 询问 C++/CX,这可能有一些不同的含义(我以前从未听说过 C++/CX,但它是微软对 C++ 的新扩展)
  • @Attila:谢谢,我的评论不恰当,已被撤回。

标签: c++ visual-c++ singleton windows-runtime c++-cx


【解决方案1】:

首先,consider whether you really need a singleton.

与普通 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 的线程安全静态初始化,因此如果您可能正在使用来自多个线程的单个实例,那么您将需要考虑使用命名空间范围的静态变量并处理任何潜在的初始化顺序问题,否则您需要调查synchronizing the initialization

【讨论】:

  • 谢谢,我一直在尝试使用典型的 C# 方法,并且已经使用了 16 个 WTF 试图让初始化工作...... :)
  • 对于未来想和 Trevor 一样的人来说,C++/CX 为 C++ 提供了 Windows 特定的扩展。插入符号表示引用计数指针。
【解决方案2】:

我这样做的方法是有一个静态变量,用于指向初始化为 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多