我正在学习C ++,而我似乎无法找到问题的答案。当我运行我的代码时,我没有得到任何编译器错误,但是当我调用函数“getVin()”时(假设使用“generate()”函数生成一个随机数)它不会所以。它输出一个零。这是我的类(来自头文件):
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;
}
任何建议都会有所帮助,谢谢!
答案 0 :(得分: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
正确使用随机值(对于运行是随机的,但对所有实例都是通用的......),而在静态字段初始化之前初始化静态值。
答案 1 :(得分:0)
在标题中,您可以:
protected:
const int m_vin = s_idgen;
在源文件中,您执行以下操作:
int Vehicle::s_idgen = generate();
当m_vin
的初始化发生时,s_idgen
的值是多少?它尚未由generate()
设置。尝试打印出来,看看我的意思。
尝试直接从您的函数返回s_idgen
。
PS:考虑使用<random>
而不是C-traditional功能。