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

voi*_*ter 6 managed-c++ c++-cli managed visual-studio-2015

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

方法一:

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

private:
    static CResourceManager m_Instance;
};
Run Code Online (Sandbox Code Playgroud)

方法二:

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

private:
    static CResourceManager^ m_Instance = gcnew CResourceManager;
};
Run Code Online (Sandbox Code Playgroud)

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

接下来是我的问题:

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

Dav*_*Yaw 6

方法2是正确的方法。您列出的代码等效于 C# 习惯用法。

方法1有点不寻常。

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

即使方法一是有效的,我还是会选择方法二:存储位置m_Instance和返回方式都简单明了、通用且易于理解。这比任何一天都必须考虑代码如何工作好。