什么是C ++中的C#Static实例?

时间:2013-11-21 13:31:01

标签: c++ visual-studio-2012

我有很多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,我只想在整个程序中使用一个。 我读到它而不是使用静态,我可以使用 extern ,它告诉编译器变量的定义在另一个文件中,因此我最终只能使用一个实例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可能不能正确支持这些功能吗?

4 个答案:

答案 0 :(得分:4)

static根据使用的位置在C ++中有不同的含义。当与变量声明一起使用时,它意味着你在想什么:没有变量的链接,它只能用于声明它的文件,甚至,如果它是一个局部变量,它只有一个副本(好)声明在它们被使用的地方附近应该是静态的局部变量的方法。

在类声明中虽然static意味着与C#中的相同,但区别在于您必须具有实际声明静态变量的源文件(或在方法中将其声明为static),这是因为这static变量必须在某处保留空间。这可以通过多种方式完成,例如:

static MyClass& instance() {
  static MyClass realInstance;
  return realInstance;
}

通过这种方式,您可以看到使用static的两种方式:一种是告诉instance()方法是static(附加到类名称空间,而不是单个实例)在包含的类中,一个声明一个静态变量,即使它是局部变量,也只有一个自身的副本。

答案 1 :(得分:2)

不,static表示在用于声明班级成员时,您想要它的含义

当用于声明全局非成员变量时,它具有“仅在当前文件中”的含义。

static是C ++中一个非常通用的词。

但是,是的,你的第一次尝试是正确的(&除外。删除它。你不想存储对一个立即超出范围并被销毁的对象的引用。你想要的存储对象本身)

答案 2 :(得分:1)

在C ++中,代码被称为“翻译单元”的单元划分。简单来说,一个翻译单位是一个.cpp文件。

“静态”变量是以其定义的平移单位存在的变量。所以,如果你有:

<强> Static.h

static int myStatic = 0;

<强> Static1.cpp

#include "Static.h"

<强> Static2.cpp

#include "Static.h"

实际上你将拥有2个静态变量myStatic副本,每个翻译单元一个。根据经验,永远不要在标题中声明静态变量,除非它是模板类(我实际上想知道为什么它仍然不是警告)。 .h文件实际上没有被编译,它们是包含的代码片段到cpp文件中(因此关键字#include

要“规范地”执行此操作,您需要这样做:

<强> Static.h

class MyClass {
public:
    static MyClass& GetInstance1();
    static MyClass& GetInstance2(); // static method means just same as in C#
// Other stuff
}

<强> Static.cpp

#include "Static.h"

static MyClass instance1(/* parameters */);
static MyClass instance2(/* other parameters */);

MyClass& MyClass::GetInstance1() {return instance1;}
MyClass& MyClass::GetInstance2() {return instance2;}

有点冗长,但在某些情况下与C#相比更灵活。

用法:

<强> SomeOtherFile.cpp

#include "Static.h"

MyClass::GetInstance1().DoSomeAction();

我相信,之后你的测试会正常运行。

答案 3 :(得分:0)

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