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

时间:2013-04-10 14:11:20

标签: c++ global-variables

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

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全局会起作用,但它也是正确的吗?或者还有其他(更正确的)替代方案吗?

2 个答案:

答案 0 :(得分:2)

这取决于。如果程序中与RNG一起使用的部分包含并且可能包含(很难看到未来)这三个函数,那些函数只需要处理一个对象 - 总是相同的,所有时间 - 那么为什么不把这个对象全局化呢?

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

当然,如果有一天这些函数必须在几个 RNG的不同实例上工作(虽然一次只有一个),那么你需要让它们接受一个实例将该类作为函数参数,让它们处理该参数。客户端必须负责提供RNG的适当实例作为这些函数的参数。

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

一般而言,在不知道您的想法以及您要撰写的应用程序或库类型的情况下提供指导并非易事。希望这有点帮助。

答案 1 :(得分:1)

使用单例模式。

只需添加一个方法:

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

并禁用对象的复制:

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

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

d = RNG::inst()();