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()と、目的の乱数が得られます。これで、すべてを使用する必要がある 3 つの関数ができobjました。グローバル宣言objは機能しますが、それも正しいですか? または、他の(より正しい)代替手段はありますか?

4

2 に答える 2

2

場合によります。動作するプログラムの部分が、RNGこれら 3 つの関数だけで構成されている場合 (ただし、将来はわかりにくい)、これらの関数が 1 つのオブジェクトに対してのみ動作する必要がある場合 (常に同じ、常に)、そのオブジェクトをグローバルにしないのはなぜですか。

が 1 つのインスタンスのみを持つように制限すること (Singleton パターン) は、その型に固有の特性でない限り避けてください。プログラムで のインスタンスを 1 つだけ使用する場合、プログラムはインスタンスを1 つだけ作成します(つまり、オブジェクトをグローバルにするか、型ではなくプログラムを制約してインスタンスを 1 つだけ作成します)。他のライブラリやプログラムがいくつかの乱数発生器を作成する可能性があることは十分に想像できます。RNG

もちろん、ある日、これらの関数が(一度に 1 つずつ) の複数の異なるインスタンスで動作RNGする必要がある場合は、そのクラスのインスタンスを関数の引数として取り、その引数で動作させる必要があります。 . RNGクライアントは、これらの関数への引数としての適切なインスタンスを提供することに注意する必要があります。

次に、ある日、これらの関数がすべて他のオブジェクト型でも機能することになり、それらのデータが何らかの形で相互に関連していることに気付いた場合、それらをデータ構造またはクラスにラップして、関数を作成することを検討できます。そのクラスのメンバー関数- それが実行する操作がその型の基本的なものである場合。

何を考えているのか、どのような種類のアプリケーションやライブラリを作成しようとしているのかを知らずに、一般的なガイドラインを提供することは容易ではありません。うまくいけば、これは少し役に立ちました。

于 2013-04-10T14:28:16.463 に答える
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()();
于 2013-04-10T14:16:11.603 に答える