所以在C#中,当我想创建全局可用的函数/变量时,我会创建一个静态类......
// SomeClass.cs
public static class SomeClass
{
private static int bar;
public static int Foo()
{
return bar;
}
}
如果我想在C ++中做同样的事情,这基本上是一回事吗?
// SomeClass.h
class SomeClass
{
private:
int bar;
public:
SomeClass();
~SomeClass();
int foo();
};
extern SomeClass gSomeClass;
并在......
// SomeClass.cpp
#include "SomeClass.h"
SomeClass gSomeClass;
SomeClass::SomeClass()
{
bar = 0;
//....
}
SomeClass::~SomeClass()
{
//....
}
int SomeClass::foo()
{
return bar;
}
并在......
#include "SomeClass.h"
int main()
{
return gSomeClass.foo();
// (basically)
}
这样做会有问题吗?
答案 0 :(得分:4)
看起来你需要一个免费的功能。这些函数不是在类中实现的,通常它们最好在命名空间中实现。
状态变量可以在匿名命名空间中实现,也可以在某种类型的外部实现。也可以使用函数local static。
这将取决于您希望如何公开与变量关联的数据,extern似乎最有可能在这种情况下。
答案 1 :(得分:3)
听起来你正试图实施singleton pattern。关于什么时候应该使用这种模式存在很多争论,因为全球变量都是坏的",但在我看来它有合法的用例。关键字" singleton"应该足以让你研究模式的各种C ++实现,并找到许多关于使用它的利弊的讨论。
答案 2 :(得分:2)
这个类类似于你的C#:
// SomeClass.h
class SomeClass
{
private:
static int bar;
SomeClass(); // not to be instantiated
public:
static int foo() { return bar; };
};
你可以这样使用它:
int x = SomeClass::foo();
答案 3 :(得分:2)
通常你可以这样做:
SomeClass.h
class SomeClass
{
static int bar;
public:
static int Foo()
{
return bar;
}
};
SomeClass.cpp
#include "SomeClass.h"
int SomeClass::bar = 0;
虽然这在我的经历中并不常见。自由职能往往更可取。变量和函数不必是像C ++这样的理智语言的类的成员。
答案 4 :(得分:1)
我认为等价物看起来像:
class MyTest
{
public:
static void Test()
{
std::cout << "Test" << std::endl;
}
};
MyTest::Test();