1

ブースト乱数ジェネレーターを使用したいオブジェクトがあるという特定の状況があり、それは私が答えることができないより大きな質問につながりました。これが私が作成しようとしているもののサンプルコードです。

まず、私のヘッダー:

Class MyObject {

 protected:
    double some variable;
    boost::random::mt19937 rgenerator;
    boost::uniform_real<double> dist_0_1;
    boost::variate_generator< boost::mt19937&, boost::uniform_real<double> > rand01
}

今私がしたいのは:

Class MyObject {

 protected:
    double some variable;

    boost::random::mt19937 rgenerator(std::time(0)); //initialize to a "random" seed
    boost::uniform_real<double> dist_0_1(0,1); //set the distribution to 0-1
    boost::variate_generator< boost::mt19937&, boost::uniform_real<double> > rand01(rgenerator, dist_0_1);//tell it to use the above two objects
}

ただし、ヘッダーにあるため、これは機能しません。MyObjectのコンストラクターを使用して、さまざまなサブオブジェクト(ディストリビューション、ジェネレーター)のコンストラクターを呼び出すことができると思いましたが、方法がわかりません。MyObjectのコンストラクターが呼び出されるまでに、サブオブジェクトのデフォルトコンストラクターはすでに呼び出されていますが、これらのプロパティをリセットするためのメンバーメソッドがあることはわかりません...それ以外に、それは私が混乱しているポイントではありません。 m紛らわしい問題ですが、私が知る限り、私の問題は次のような幼稚な例になります。

Class Tree {

    Tree();
    Tree(int);

    protected: 

        fruit apples(int);
}

Tree::Tree() {
    apples(0); //won't work because we can't call the constructor again?
}

Tree::Tree(int fruit_num) {
    apples(fruit_num); //won't work because we can't call the constructor again?
}

Class Fruit {

    public:
        Fruit();
        Fruit(int);

    protected:
        int number_of_fruit;

}

Fruit::Fruit() {

    number_of_fruit = 0;
}

Fruit::Fruit(int number) {

    number_of_fruit = number;

}

これは他のすべての人にとって第二の性質であると確信していますが、オブジェクトのメンバーオブジェクトをデフォルト以外のコンストラクター値に初期化するためのベストプラクティスについて説明している記事は見つかりません。

4

3 に答える 3

6

必要なのは初期化子リストです。例えば:

Tree::Tree(int fruit_num) 
    : apples(fruit_num) // Initializes "apple" with "fruit_num"
{
}

:コンストラクターパラメーターの後、開始中括弧の前にコロン()を追加するだけです{。異なるメンバーコンストラクターはコンマ(,)で区切ることができます。例:

Tree::Tree(int fruit1, int fruit2) : apples(fruit1), bananas(fruit2) {
}
于 2011-09-21T22:38:16.077 に答える
2

この質問への答えは比較的簡単です。初期化子リストを使用します。

次に例を示します。

class MyClass {
private:
     SomeOtherType sot;
public:
    MyClass() : sot(parametersForConstructorOfSOT) {}
};

もちろん、これを複数のメンバーオブジェクトに拡張できます。また、そのようなことを行う必要がある場合は、親クラスのコンストラクターを呼び出して、親クラスのプライベートエントリを初期化するために使用することもできます。

于 2011-09-21T22:36:52.330 に答える
2

あなたはとても近いです!初期化子リストの構文を使用するだけです。

Tree::Tree() : apples(0) {
    // ...
}

Tree::Tree(int fruit_num) : apples(fruit_num) {
    // ...
}
于 2011-09-21T22:37:35.717 に答える