2012-08-05 2 views
1

백그라운드 :C++ : 벡터 <Base*>

내가 N-의 중력 진화를 계산 C++에 물리 엔진을 짓고 있어요 몸체 시스템을 데카르트 공간에 배치 한 다음 사전 정의 된 좌표계 ​​세트로 변환합니다. 궁극적으로 목표는 시작 좌표계를 임의로 만드는 것입니다 (데카르트 만이 아닌 좌표계 'n'으로 계산). 그러나 이는 먼 목표입니다.

문제 : 좌표계를 상호 교환하도록되어 있으므로

, 전 좌표계 염기 확장 직교 좌표계 만들었다 : 포인터를 생성 할 때

class CoordMember { 
} 

class CoordState { 
    public: 
     /* methods to operate on members */ 

    protected: 
     std::vector<CoordMember*> members; 
} 

class Particle : public CoordMember { 
} 

class CartState : public CoordState { 
} 

오류가 발생 형의 멤버를 가리키는 std::vector<Particle*> 유형 std::vector<CoordMember*>의 객체 :

CartState* state = new CartState(/* initialization vars */); 
std::vector<Particle*>* parts = static_cast< std::vector<Particle*>* >(&state->members); 

컴파일러 오류가 있습니다 :

error: static_cast from 'std::vector<CoordMember *> *' to 'std::vector<Particle *> *' is not allowed 
error: no viable overloaded '=' 

내가 state->members의 데이터 유형 Particle*의 모두이 시점에서 사실을 알고있다. 내가 알지 못하는 것은이 캐스트를 가능하게하기 위해서 무엇을해야만하는지입니다. 어떤 아이디어?

TL; DR 다음 vector들 전혀 관계가없는 이기 때문에

std::vector<Derived*>* ptr = static_cast< std::vector<Base*>* >(&object); 
static_cast from 'std::vector<Derived*>*' to 'std::vector<Base*>*' is not allowed 

답변

5

이 캐스트가 작동하지 않습니다. 벡터의 각 객체를 캐스팅해야합니다.

+0

어떻게해야합니까? 나는 구성원 벡터의 내용을 다른 유형의 벡터에 복사하고 싶지 않습니다. (원 구성원 함수를 조작하고 싶습니다.) 저는 벡터를 파생 된 형식의 벡터로 취급하고 싶습니다. 함수 호출. – chpatton013

+1

@ chpatton013 할 수 없으므로 복사 할 필요가 없습니다. 벡터 내부의 요소를 사용하기 전에 필요한 유형으로 캐스트하십시오. –

+3

여러분은 그것들을 다형성으로 사용하게 될 것이고, 해결책은 처음에는'벡터 '을 유지하는 것입니다. 'Base' 클래스에 대한 가상 소멸자를 정의해야합니다. – marko