什么是C++中C#静态实例的等价物
What is the equivalent of a C# Static instance in C++?
我有很多C#代码必须用C++编写。我在C++方面没有太多经验。
我正在使用Visual Studio 2012进行构建。该项目是C++中的静态库(不在C++/CLI中)。
在C#代码中,有一个类为其创建了一些静态实例
C#
namespace MyNamespace
{
public class MyClass
{
//Class Code
static public MyClass Instance1 = new MyClass(/*parameters*/);
static public MyClass Instance2 = new MyClass(/*other parameters*/);
我需要在C++中做一些类似的事情,到目前为止我得到了:
C++
namespace MyNamespace
{
class MyClass
{
//Class Code
}//end of class
static MyClass& Instance1 = MyClass(/*parameters*/);
static MyClass& Instance2 = MyClass(/*other parameters*/);
}//end of Namespace
然而,从我读到的内容来看,这并不完全相同,通过添加"静态"一词,我所做的是我的Instance1和Instance2仅在当前文件的范围内可见。这是正确的吗?
所以我不想要一堆Instance1,我只想要整个程序中的一个。我读到,我可以使用external而不是使用静态,这告诉编译器变量的定义在另一个文件中,因此我最终只能使用Instance1和Instance2的一个实例,而不能使用多个实例。
所以我尝试过:
C++MyClass.h
extern MyClass& Instance1;
extern MyClass& Instance2;
C++MyClass.cpp
MyClass& Instance1 = MyClass(/*parameters*/);
MyClass& Instance2 = MyClass(/*other parameters*/);
这构建得很好,但当我尝试运行测试时,他们会抛出一个错误:
Failed to set up the execution context to run the test
在使用extern之前,我的测试运行得很好,但当我添加它时,它们就不起作用了。这让我相信我没有正确地声明,或者Visual Studio 2012没有正确地支持其中的一些功能?
static
在C++中根据其使用位置而具有不同的含义。当与变量声明一起使用时,这意味着你所想的:变量没有链接,它只对声明它的文件可用,甚至,如果它是局部变量,它只有一个副本(声明局部变量的好方法是,在使用它们的地方附近应该是静态的)。
在类声明中,尽管static的意思与C#中的意思相同,但不同之处在于必须有一个实际声明静态变量的源文件(或在方法中声明为static
),这是因为这个static
变量必须在某个地方保留空间。这可以通过多种方式实现,例如:
static MyClass& instance() {
static MyClass realInstance;
return realInstance;
}
通过这种方式,您可以看到使用static
的两种方法:一种是告诉instance()
方法是所包含类中的static
(附加到类命名空间,而不是单个实例),另一种是声明一个静态变量,即使它是局部变量,它也只有一个自身副本。
否,static
在用于声明类成员时的意思是。
当用于声明全局非成员变量时,它具有"仅在当前文件中"的含义。
static
是C++中一个非常通用的词。
但是,是的,你的第一次尝试是正确的(除了&
。删除它。你不想存储对立即超出范围并被销毁的对象的引用。你想存储对象本身)
在C++中,代码由称为"翻译单位"的单位划分。简单地说,翻译的一个单位是一个.cpp
文件。
"静态"变量是指以定义的翻译单位存在的变量。所以,如果你有:
静态.h
static int myStatic = 0;
Static1.cpp
#include "Static.h"
Static2.cpp
#include "Static.h"
实际上,您将有两个静态变量myStatic的副本,每个翻译单元一个。根据经验,永远不要在头中声明静态变量,除非它是一个模板类(我真的想知道为什么它仍然不是一个警告)。h文件实际上并没有被编译,它们是包含在cpp文件中的代码片段(因此关键字#include
)
要做到"规范",你需要这样做:
静态.h
class MyClass {
public:
static MyClass& GetInstance1();
static MyClass& GetInstance2(); // static method means just same as in C#
// Other stuff
}
静态.cpp
#include "Static.h"
static MyClass instance1(/* parameters */);
static MyClass instance2(/* other parameters */);
MyClass& MyClass::GetInstance1() {return instance1;}
MyClass& MyClass::GetInstance2() {return instance2;}
有点冗长,但在某些情况下与C#相比更灵活。
用法:
SometerFile.cpp
#include "Static.h"
MyClass::GetInstance1().DoSomeAction();
我相信,你的测试会在那之后正确运行。
静态变量不能在声明它们的文件外部"看到"。但是,如果您需要在其他文件中使用该变量,您可以在类中编写一个返回该静态变量的静态函数。
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 建议在运行时将带有类实例的列表从c++导入qml
- 约束和显式模板实例化
- 通过实例理解std::move及其目的
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 正在生成未知类实例
- 从DLL中删除类的实例
- 什么是C++中C#静态实例的等价物