2

<random>我使用C++11绘制随机数。我通过创建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。声明objglobal 会起作用,但它也正确吗?还是有其他(更正确的)替代方案?

4

2 回答 2

2

这取决于。如果您的程序中使用的部分RNG包括并且可能包括(尽管很难看到未来)只是这三个函数,并且这些函数只需要在一个对象上工作 - 始终相同,一直 - 那么为什么不将该对象设为全局。

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

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

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

在不知道您的想法以及您要编写什么样的应用程序或库的情况下给出一般指导方针并不容易。希望这会有所帮助。

于 2013-04-10T14:28:16.463 回答
1

使用单例模式。

只需添加一种方法:

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

并禁用您的对象的复制:

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

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

d = RNG::inst()();
于 2013-04-10T14:16:11.603 回答