2016-08-10 19 views
0

는 예를 들어, I는 (정적 변수 임) A는 [] 점 A의 좌표를 나타내는 한 쌍의 어레이를 갖고, B, C :다른 하드 코드 배열의 데이터에 따라 자동으로 하드 코드 배열을 생성 할 수 있습니까?

pair<float,float> MyClass::a[]={{0,0},{320,568},{640,0}}; 

난 길이를 저장 [] B 다른 배열을 할 AB와 BC의 :

float MyClass::b[sizeof(a)/sizeof(pair<float,float>)-1]={ 
    sqrt((a[1].first-a[0].first)*(a[1].first-a[0].first)+(a[1].second-a[0].second)*(a[1].second-a[0].second)), 
    sqrt((a[2].first-a[1].first)*(a[2].first-a[1].first)+(a[2].second-a[1].second)*(a[2].second-a[1].second)) 
}; 

하지만 [η]에 요소를 추가하는 경우, I 수동 [] b를 변경할 필요가 있으므로 B [] 매우 유지 보수가 아니다. 자동으로 b []를 생성 할 수있는 방법이 있습니까? 예를 들어, 같은 같은 것도 있나요 : 매크로

float b[]={MACRO(a)}; 

또는

float b[]={MACRO(sizeof(a)/sizeof(pair<float,float>))}; 

또는 템플릿 :

template<int i> 
struct s{ 
    float b[]={something a[i+1]-a[i]}; 
}; 

s<sizeof(a)/sizeof(pair<float,float>)> _s; 

또는 다른 디자인 패턴 나 B를 변경하지 않고 []의 크기를 변경할 수 있습니다 수동으로 또는 코드의 다른 부분을 수정할 필요가 없습니다.

+0

사용'표준 : vector' 그것을 채울 수있는'for' 루프}

template<typename T, size_t N> std::array<T, N> sqrt(std::pair<T,T> (&points)[N]) { using std::sqrt; std::array<T, N> retval; for (int i = 0; i != N; ++i) { retval[i] = sqrt(points[i].first * points[i].first + points[i].second * points[i].second) ; } return retval; 

와 함께. –

답변

1

하나의 분명한 대답은 배열 대신 벡터를 사용하는 것입니다 :이

template <class T, size_t N> 
size_t elements(T (&array)[N]) { 
    return N; 
} 

// could also use a vector for a, if desired: 
pair<float,float> a[]={{0,0},{320,568},{640,0}}; 
vector<float> b; 

for (int i=1; i<elements(a); i++) { 
    float dx = a[i].first - a[i-1].first; 
    float dy = a[i].second - a[i-1].second; 
    b.push_back(sqrt(dx*dx + dy * dy)); 
} 

제대로 크기를 추적 할 b에 대한 다른 변경을 필요로하지 않습니다 a의 크기의 변화를.

물론 다른 방법으로 작업을 수행 할 수 있습니다. 예를 들어,이 작업을 상당히 많이 수행했다면 class에 모든 것을 포함 할 수 있습니다. 나는 그것이 실제로 의미있는 것을 얻는다는 것을 확신하지 못한다.

0

여기서 가장 큰 문제는 C 배열을 사용하는 것입니다. 초기화하기가 쉽지 않습니다. 는 표준 : 배열과 함께, 그것은 매우 간단합니다 :

pair<float,float> MyClass::a[]={{0,0},{320,568},{640,0}}; 
auto b = sqrt(a);