C ++ C#静态类的等价物

时间:2016-02-01 17:18:01

标签: c++

所以在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)
}

这样做会有问题吗?

5 个答案:

答案 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();