2012-04-23 2 views
1

같은 유형의 멤버 집합을 반복하고 싶습니다. 다음은 때때로 작동하는 솔루션입니다.참조 된 배열로 클래스 멤버를 순환합니다 (C++)

#include <iostream> 
#include <vector> 
class Test{ 
    public: 
     Test():xmin(0),ymin(0),xmax(0),ymax(0),acs((vector<int> (&)[4])xmin){}; 
     vector<int> xmin,ymin,xmax,ymax; 
     vector<int> (&acs)[4]; 
}; 
int main(){ 
    Test t; 
    t.xmin.push_back(2); 
    cout << t.xmin.size() << "=!=" <<t.acs[0].size() << endl; 
} 

위의 테스트 코드는 저에게 적합합니다. 훨씬 더 큰 프로그램에서 나는 그렇지 않습니다. 즉, t.ymin은 t.acs [1]와 같지 않습니다. 위의 구문은 일반적으로 의미가 있습니까? 아니면 완전히 다르게해야합니까? 사전에

감사합니다, 토마스

+4

당신은 확실히이 정의되지 않은 동작으로 연주 :

#include <iostream> #include <vector> struct Test { std::vector<int> xmin,ymin,xmax,ymax; std::vector<int>& GetByIndex(int index) { typedef std::vector<int> Test::*ptr_to_member; // typedef makes syntax less crazy static const ptr_to_member pointers[4] = { &Test::xmin, &Test::ymin, &Test::xmax, &Test::ymax }; return this->*pointers[index]; } }; int main(){ Test t; t.xmin.push_back(2); std::cout << t.xmin.size() << "=!=" << t.GetByIndex(0).size() << '\n'; } 

당신이 속도를 필요로하지 않는 경우, 아주 간단한 해결책은 스위치를 포함한다. 연속되는 클래스 멤버가 배열 요소와 같은 방법으로 배치된다는 보장은 없습니다. –

답변

2

회원에 대한 포인터의 배열을 사용할 수 있습니다. 이 방법은 아마도 가장 빠르며 (중요하다고 생각되는 것처럼 보일 수도 있지만) 약간은 모호하며 멤버 변수 목록을 두 번째 언급해야합니다.

std::vector<int>& GetByIndex(int index) 
{ 
    switch (index) { 
    case 0: return xmin; 
    case 1: return ymin; 
    case 2: return xmax; 
    case 3: return ymax; 
    default: abort(); 
    } 
} 
+0

잘못된 색인에서'중단 '을하는 것이 좋습니다 ... "느린"스위치 버전은 실제로 눈에 띄지 않아야합니다. – RedX

+0

고마워, 그 트릭을 할 것입니다! 관련 문제에 대한 : 나는 포인터를 생성자'Test() : xmin (0), ymin (0), xmax (0), ymax (0), acs ({& xmin, & ymin, & xmax, & ymax}) {};'및 멤버 '벡터 * acs [4];'. 그것은 테스트 스크립트에서 작동하는 것처럼 보입니다. 경고를받습니다 : -std = C++ 0x 또는 -std = gnu ++ 0x'로만 사용 가능한 확장 초기화 프로그램 목록. 생성자와 이니셜 라이저 목록에 할당하지 않으면 동일한 경고가 발생합니다. 나는 귀찮게해야합니까? 감사 –

0

마이크 시모어 그렇고 말고요 바로 - 솔루션은 위험합니다. 다음

해보십시오 사부 : 당신이 조금 긴 한정자를 쓸 필요가 이것에 대한

class Test 
{ 
    struct AllArrays 
    { 
     vector<int> * vec1, .... * vecN; 
    }; 
    union 
    { 
     AllArrays _as_fields; 
     vector<int> * _as_Array[]; 
    } _allTogether; 
}; 

페이로드 :

Test t; 
t._allTogether._as_fields.vec1 
+0

'vector'를 포함하는'union'은 유효하지 않습니다 (컴파일하지 않습니다), 적어도 C++에서는 – anatolyg

+0

@anatolyg는'vector *'포인터를 사용했는지 확인합니다. 포인터는 유니온 안에서 허용됩니다! – Dewfy

+0

그런 다음'% * as_array [4]'대신'vector [] _as_Array'을 사용해야합니다. – anatolyg

0

이 아주 나쁜 방법입니다. 특히, 당신은 padding 세부 사항에 의존하고 있습니다. 컴파일러가 패딩없이 데이터 멤버를 레이아웃 할 것이라는 보장은 없습니다. 어레이이고, 이면 배열은입니다. 내 2c ...

관련 문제