2017-10-11 16 views
3

私はC++を学習していますが、私の問題の答えを見つけることができないようです。私のコードを実行するとコンパイラのエラーは出ませんが、 "getVin()"( "generate()"関数を使って乱数を生成すると仮定します)を呼び出すと、そう。ゼロを出力します。ここでは(ヘッダファイルから)私のクラスには、次のとおりです。クラス内のsrand関数

class Vehicle { 
public: 
    Vehicle(); 
    static int generate(); 
    const int getVin() { return m_vin; } 

protected: 
    float m_lla[3]; 
    const int m_vin = s_idgen; 

private: 
    static int s_idgen; 
}; 

と定義(ソースファイルから):

int Vehicle::s_idgen = generate(); 

Vehicle::Vehicle() { 
    m_lla[3] = 0; 
} 

int Vehicle::generate() { 
    srand((int)time(0)); 
    return (rand() % 10000) + 1; 
} 

何かアドバイスが参考になる、ありがとうございました!ヘッダで

+1

あなたは 'srand'を* once *と呼ぶべきです。たとえば、 'time'関数は通常、秒単位で何回も' generate'関数を呼び出すと、同じ値にシードをリセットして同じ "ランダム"数。また、C++は普通の 'srand'や' rand'よりはるかに優れた[擬似ランダム生成機能](http://en.cppreference.com/w/cpp/numeric/random)を持っています。 –

+0

これについて考えてみましょう。これはいつですか? 'const int m_vin = s_idgen;' 's_idgen'はいつ設定されますか? – juanchopanza

+2

質問は提案された質問と重複しているとは思わないでください:OPの問題はsrandへの繰り返しの呼び出しとは関係ありませんが、@ Serge Ballesta anwerのように静的変数の初期化の順序に関係します。 –

答えて

0

、あなたは:

protected: 
    const int m_vin = s_idgen; 

をソースファイルにいる間、あなたは:

int Vehicle::s_idgen = generate(); 

m_vinの初期化が発生した場合、s_idgenの値は何ですか?それはまだgenerate()によって設定されていません。私が何を意味するかを見て、それを印刷してみてください。

s_idgenを関数から直接返すようにしてください。


PS:Cの伝統的な機能の代わりに<random>を使用することを検討してください。

1

私は部分的に再現できるので、で静的な初期化の失敗をに噛まれたと仮定します。私はちょうど追加しました:

すぐに車の宣言の後に任意の方法または静的フィールド定義の前に
Vehicle sveh; // static scoped 

、その後、

int main() { 
    Vehicle veh; 
    std::cout << veh.getVin() << std::endl; 
    std::cout << sveh.getVin() << std::endl; 
    return 0; 
} 

出力は次のとおりです。

1915 
0 

自動ことを意味することにVehicleランダム値を正しく使用します(実行にはランダムですが、すべてのインスタンスに共通です...)。静的フィールド初期化の前に静的フィールドが初期化されています。

関連する問題