什么是C++中C#静态实例的等价物

What is the equivalent of a C# Static instance in C++?

本文关键字:实例 等价物 静态 C++ 什么      更新时间:2023-10-16

我有很多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();

我相信,你的测试会在那之后正确运行。

静态变量不能在声明它们的文件外部"看到"。但是,如果您需要在其他文件中使用该变量,您可以在类中编写一个返回该静态变量的静态函数。