在Managed C ++中,在类中定义静态单例实例的正确方法是什么?

时间:2015-11-22 16:11:41

标签: c++-cli visual-studio-2015 managed managed-c++

从Visual Studio 2013跳转到Visual Studio 2015,我注意到编译器接受托管C ++类中的静态自我实例的方式存在一些差异。考虑以下两个例子:

方法1:

public ref class CResourceManager
{
public:
    static property CResourceManager^ Instance
    {
        CResourceManager^ get() { return %m_Instance; }
    }

private:
    static CResourceManager m_Instance;
};

方法2:

public ref class CResourceManager
{
public:
    static property CResourceManager^ Instance
    {
        CResourceManager^ get() { return m_Instance; }
    }

private:
    static CResourceManager^ m_Instance = gcnew CResourceManager;
};

方法1曾经在2013年工作,但它在2015年未能编译。遗憾的是,我没有准确的编译器错误,但它是“变量名前缺少分号”错误之一,基本上说它不能'找到类型CResourceManager(指向静态变量声明)。

关于我的问题:

  1. 方法1应该在托管C ++中有效还是有效?
  2. 为什么第二种方法在2015年有效,但不是第一种方法(即有什么区别)?
  3. 哪种方法是实现最终目标的正确方法?

1 个答案:

答案 0 :(得分:3)

方法2是正确的方法。您列出的代码相当于C#惯用语。

方法1有点不寻常。

  • 声明中缺少^通常意味着该变量未在托管堆上分配。但是,由于它是一个静态类成员,我不确定它实际创建的位置。
  • %通常用于声明跟踪引用,相当于在C#中通过refout传递变量。说实话,我认为将%应用于没有^%且将结果作为^的变量甚至无效。 (虽然考虑到2015编译器拒绝它,但可能不会。)

即使方法1有效,我仍然会使用方法2:m_Instance的存储位置及其返回方式既简单,通用且易于理解。这不得不考虑代码如何在任何一天工作。