2016-12-16 9 views
1

기본적으로 다른 클래스 멤버에 의해 초기화되지만 잘 초기화 된 비 정적 멤버 theta입니다. 그런 다음 valley_maxtheta으로 초기화합니다. 지금은 모든 것이 잘 작동합니다. 그런 다음 바운드가 valley_max 인 배열을 초기화하고 싶습니다. 당신이 볼 수있는 C++ 초기화 클래스 멤버 변수는 다른 멤버 변수에 따라 다릅니다.

가 그럼 난 static const int valley_max를 추가 비 정적 데이터 멤버의

잘못된 사용 : 첫째, 나는 오류가 발생했습니다. 바인딩 배열이

나는 그의 다른 초기화 멤버 변수에 의해 초기화 바인딩 배열을 초기화 할 수 있다면 난 그냥 궁금 토큰 전에 정수 상수 ']'아니다

:하지만 오류가 같이있어 멤버 변수.
도움 주셔서 감사합니다.

AP_Tmxk_VFH.cpp

AP_Tmxk_VFH::AP_Tmxk_VFH() : 
    l(5), 
    threshold(5), 
    safe_space(0.7), 
    detected_range(2.5), 
    theta(degrees(acos(1-sq(safe_space)/(2*sq(detected_range))))), 
    valley_max(round_float(180.0/theta)), 
    valley_count(0), 
{ 
} 

AP_Tmxk_VFH.h

class AP_Tmxk_VFH { 
privte: 
     int l; 
     int threshold; 
     int safe_space; 
     int theta; 
     int detected_range; 
     static const int valley_max ; 
     struct{ 

     bool inside_valley = false; 
     uint16_t up_bound = 0; 
     uint16_t down_bound = 0; 
    }valley[valley_max]; 
} 

답변

2

귀하의 특정 문제로 인해 가변 길이 배열은 C++에서 지원되지 않는 사실이다. 대신 std::vector 또는 다른 C++ 표준 라이브러리 컨테이너를 사용해보십시오.

는하지만 (내 의견에 질문 관심을 만든다) 더 문제가 : 회원 초기화의 순서는 그들이 클래스 정의에 나타나는 순서입니다 하지가 초기화에 나타나는 순서를.

예를 들어, 귀하의 경우 thetadetected_range 전에 를 초기화하고, 후자 이후 코드의 동작은 정의되지 않습니다 당신이 theta, 의 평가에서 사용 시점에서 초기화되지 않는다!

귀하의 경우, 회원이 const이 될 필요가 없다면, 나는 당신이라면 생성자 본문에 리터럴로 설정되지 않은 멤버를 초기화 할 것입니다.

0

다른 멤버 변수로 초기화 된 멤버 변수로 초기화 된 배열을 초기화 할 수 있는지 궁금합니다.

아니요. 이러한 변수가

없습니다 오류 메시지가 말한다 같은

정수 상수이기 때문에

당신은 할 수 없습니다.멤버 변수의 값은 컴파일 타임에 알 수 없습니다. 이는 배열의 크기가 컴파일시의 상수 (즉, 컴파일 타임에 알려짐) 여야한다는 요구 사항과 상충됩니다.

해결책 : 대신 std::vector을 사용하십시오. 벡터의 크기는 컴파일 할 때 잠기지 않습니다.