2017-10-11 50 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正确使用随机值(对于运行是随机的,但对所有实例都是共同的),而静态字段在静态字段初始化之前已初始化。