我应该声明我的对象是全局的还是静态的?

should I declare my object global or static?

本文关键字:静态 声明 全局 对象 我应该 我的      更新时间:2023-10-16

我使用c++ 11中的<random>绘制随机数。我通过创建以下类的实例obj来做到这一点(对于感兴趣的读者:它来自这个线程):

class RNG
{
public:
    typedef std::mt19937 Engine;
    typedef std::uniform_real_distribution<double> Distribution;

    double operator()()
    {
        return distribution(engine);
    }
    Engine engine;
    Distribution distribution;
};

呼叫obj()会得到我想要的随机数。现在,我有三个函数都必须使用obj。声明obj全局将工作,但它也是正确的吗?或者还有其他(更正确的)选择吗?

看情况。如果您的程序中使用RNG的部分由并且很可能由这三个函数组成(尽管很难看到未来),并且这些函数只需要在一个对象上工作-总是相同的,所有时间-那么为什么不将该对象设置为全局对象呢?

避免限制类型只有一个实例(单例模式),除非这是该类型的固有特征。如果你的程序只使用RNG的一个实例,那么你的程序将只创建一个实例(即,使对象全局,或者约束你的程序-而不是类型-只创建一个实例)。我可以很好地想象其他库或程序可能会创建几个随机生成器。

当然,如果有一天这些函数必须在几个不同的RNG实例上工作(尽管一次一个),那么您需要让它们将该类的一个实例作为函数参数,并让它们处理该参数。客户端必须注意提供适当的RNG实例作为这些函数的参数。

然后,如果有一天你意识到这些函数最终也会在其他对象类型上工作,并且这些数据以某种方式相互关联,你可以考虑将它们包装在一个数据结构或一个类中,可能使你的函数成员函数该类-如果它执行的操作是该类型的基本

在不知道你想要什么,不知道你要写什么样的应用程序或库的情况下给出一般的指导方针是不容易的。

使用单例模式

只需添加一个方法:

 static RNG& inst()
 {
     static RNG instance;
     return instance;
 }

并禁止复制你的对象:

private:
    RNG(const RNG&); // without implementation
    RNG& operator=(const RNG&); // without implementation

然后你可以访问你的实例:

d = RNG::inst()();