在托管 C++ 中,在 class 中定义静态单例实例的正确方法是什么?
In Managed C++, what is the proper way to define a static singleton instance in a class?
从 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;
};
方法二:
public ref class CResourceManager
{
public:
static property CResourceManager^ Instance
{
CResourceManager^ get() { return m_Instance; }
}
private:
static CResourceManager^ m_Instance = gcnew CResourceManager;
};
方法 1 曾在 2013 年工作,但在 2015 年无法编译。不幸的是,我手边没有确切的编译器错误,但这是 "Missing semicolon before variable name" 错误之一,基本上说它不能' t 找到类型CResourceManager
(指向静态变量声明)。
继续我的问题:
- 方法 1 是否应该在托管 C++ 中工作或有效?
- 为什么第二种方法在 2015 年有效,而第一种方法无效(即有什么区别)?
- 哪种方法是实现最终目标的正确方法?
方法2是正确的方法。您列出的代码等同于 C# 习惯用法。
方法一有点不一般。
- 声明中缺少
^
通常意味着该变量未分配到托管堆上。但是,由于它是一个静态 class 成员,我不确定它实际是在哪里创建的。
%
通常用于声明跟踪引用,相当于在 C# 中通过 ref
或 out
传递变量。老实说,我不认为将 %
应用于没有 ^
或 %
的变量并将结果作为 ^
甚至是有效的。 (虽然考虑到 2015 编译器拒绝它,但它可能不是。)
即使方法一可行,我还是会选择方法二:m_Instance
的存储位置和返回方式都比较通俗易懂。这比每天都必须考虑代码如何工作要好。
从 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;
};
方法二:
public ref class CResourceManager
{
public:
static property CResourceManager^ Instance
{
CResourceManager^ get() { return m_Instance; }
}
private:
static CResourceManager^ m_Instance = gcnew CResourceManager;
};
方法 1 曾在 2013 年工作,但在 2015 年无法编译。不幸的是,我手边没有确切的编译器错误,但这是 "Missing semicolon before variable name" 错误之一,基本上说它不能' t 找到类型CResourceManager
(指向静态变量声明)。
继续我的问题:
- 方法 1 是否应该在托管 C++ 中工作或有效?
- 为什么第二种方法在 2015 年有效,而第一种方法无效(即有什么区别)?
- 哪种方法是实现最终目标的正确方法?
方法2是正确的方法。您列出的代码等同于 C# 习惯用法。
方法一有点不一般。
- 声明中缺少
^
通常意味着该变量未分配到托管堆上。但是,由于它是一个静态 class 成员,我不确定它实际是在哪里创建的。 %
通常用于声明跟踪引用,相当于在 C# 中通过ref
或out
传递变量。老实说,我不认为将%
应用于没有^
或%
的变量并将结果作为^
甚至是有效的。 (虽然考虑到 2015 编译器拒绝它,但它可能不是。)
即使方法一可行,我还是会选择方法二:m_Instance
的存储位置和返回方式都比较通俗易懂。这比每天都必须考虑代码如何工作要好。