0

コンストラクターでクラス フィールドとして uniform_int_distribution を使用する方法。私は++が初めてです。次のアプローチを試みていますが、エラーが発生しました。

class RandomConnectionsProvider : RandomProviderBase
{
public:
    RandomConnectionsProvider(mainDataType operatorsCount);
    ~RandomConnectionsProvider(void);
    static mainDataType GetNextConnectedOper();
private:
    uniform_int_distribution<int>* connections_dist;
    static random_device rd;
    static mt19937 rnb;
};

RandomConnectionsProvider::RandomConnectionsProvider(mainDataType operatorsCount)
{
    uniform_int_distribution<int> op_dist(1, OperatorsCount);
    connections_dist = &op_dist;
}

mainDataType  RandomConnectionsProvider::GetNextConnectedOper()
{
    return *connections_dist(rnb);//Triing  to dereference as i remember it but got error there
}
4

2 に答える 2

3

connections_distコンストラクターでローカル変数を指定します。このローカル変数は、コンストラクターが戻るときに破棄されるため、ポインターは有効なオブジェクトを指しなくなります。

代わりに、ポインターの使用をスキップして、代わりに次のようにすることをお勧めします。

class RandomConnectionsProvider : RandomProviderBase
{
    std::uniform_int_distribution<int> connections_dist;  // Note: no pointer

    // ...

public:
    RandomConnectionsProvider::RandomConnectionsProvider(mainDataType operatorsCount)
        : connections_dist(1, operatorsCount)
    { }

    // ...
};

コンストラクターのコロンの後の部分は初期化子リストと呼ばれ、オブジェクト内のメンバー変数を初期化するために使用されます。

逆参照を使用する必要がないため、ポインターを使用しないと、他のエラーを修正するのにも役立ちます。ちなみに、そのエラーは、関数呼び出しの演算子の優先順位が逆参照演算子よりも高いためです (したがって、コンパイラはあなたがやっていると考えています*(connections_dist(rnb)))。

于 2013-10-02T11:44:29.797 に答える
1

問題は、コンストラクターが終了するとローカルop_distオブジェクトが破棄されるため、後で使用できないことです。あなたのconnections_distポイントは無効なメモリです。

2 つの可能な解決策があります:
1. ポインターではなく、オブジェクト メンバー
を使用uniform_int_distribution<int> connections_distします。次のように、直接使用し、初期化子リストを使用して初期化します。

RandomConnectionsProvider::RandomConnectionsProvider(mainDataType operatorsCount)
: connections_dist ( 1, OperatorsCount )
{
}

2. オブジェクトを動的に割り当て、これによりその寿命を延ばします。次
のように、デストラクタで再度削除する必要があります。

RandomConnectionsProvider::RandomConnectionsProvider(mainDataType operatorsCount)  {
    connections_dist  = new uniform_int_distribution<int>(1, OperatorsCount);
}
RandomConnectionsProvider::~RandomConnectionsProvider() {
    delete connections_dist;
}
于 2013-10-02T11:50:11.460 に答える