2017-10-11 12 views
3

나는 C++을 배우고 있으며 내 문제에 대한 답을 찾지 못하는 것 같습니다. 내 코드를 실행할 때 어떤 컴파일러 오류도 발생하지 않지만 "getVin()"("generate()"함수를 사용하여 임의의 숫자를 생성해야 함) 함수를 호출하면 작동하지 않습니다. 그래서. 0을 출력합니다. (소스 파일)srand function in class

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' 함수는 보통 * seconds *의 시간을 반환합니다. 즉,'generate' 함수를 1 초 내에 여러 번 호출하면 동일한 값으로 시드를 재설정하고 동일한 "임의"숫자를 얻습니다 . 또한 C++은 평범한'srand'와'rand'보다 훨씬 더 나은 [pseudo-random generation facility] (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을 직접 함수에서 반환 해보십시오.


추신 : 전통적인 기능 대신 <random>을 사용하는 것이 좋습니다.

1

부분적으로 재현 할 수 있으므로 초기화 초기화 오류로 인해 물려받은 것으로 가정합니다..

Vehicle sveh; // static scoped 

즉시 차량 선언 후 임의의 방법 또는 정적 필드 정의 전에 다음

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

출력된다 : I은 추가

1915 
0 

즉 자동 Vehicle 그 정적 값은 정적 필드를 초기화하기 전에 초기화되는 반면, 랜덤 값을 사용합니다 (런에는 랜덤하지만 모든 인스턴스에 공통입니다 ...).