2017-10-11 87 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' *一次*。例如,'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:考慮使用<random>而不是C-傳統函數。

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正確使用隨機值(對於運行是隨機的,但對所有實例都是共同的),而靜態字段在靜態字段初始化之前已初始化。