我有很多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可能不能正确支持这些功能吗?
答案 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)
静态变量不能在您声明它们的文件外“看到”。但是如果你需要在其他文件中使用该变量,你可以在一个返回该静态变量的类中编写一个静态函数。