2016-07-06 3 views
1

System 클래스에서 상속받은 MovementSystem 클래스가 있습니다. 내가 xxxSystem의 인스턴스를 저장할 수 있도록 나중에 내가 xxxSystem 클래스의 수를 가지는 맵에이 방법 (시스템 당 하나 개의 인스턴스가) : 내 수업을 필요로하기 때문에C++ 다형성 - 상속 된 클래스의지도

enum 
{ 
    MOVEMENT_SYSTEM 
}; 

std::map<int,std::unique_ptr<System>> systems; 
systems[MOVEMENT_SYSTEM] = std::unique_ptr<System>(new MovementSystem()); 

m_entityManager.loadSystems(&systems); 

마지막 줄이 EntityManager 모든 시스템에 액세스 할 수 있습니다.

std::map<int,std::unique_ptr<System>> *m_systems; // this line is in the header 

void EntityManager::loadSystems(std::map<int,std::unique_ptr<System>> *systems) 
{ 
    m_systems = systems; 
} 

그리고 마지막으로 EntityManager의 다른 방법으로 내가이 클래스에 이런 식으로 보낸 시스템에 액세스하려고 :

std::unique_ptr<MovementSystem> mvt = (*m_systems)[MOVEMENT_SYSTEM]; 
mvt->update(dt); 

하지만 수를

그러므로 나는이 방법이 이 오류 :

conversion from 'std::map<int, std::unique_ptr<System> >::mapped_type {aka std::unique_ptr<System>}' to non-scalar type 'std::unique_ptr<MovementSystem>' requested 

어떻게 해결할 수 있으며 마지막 행을 호출 할 수 있습니까? 업데이트 방법은 MovementSystem?

+0

표현'* m_systems을 [ MOVEMENT_SYSTEM]'은 당신이 생각하는대로하지 않습니다. [연산자 우선 순위] (http://en.cppreference.com/w/cpp/language/operator_precedence)로 인해'm_systems'가 포인터이기 때문에 작동하지 않는'* (m_systems [MOVEMENT_SYSTEM])'으로 번역됩니다. '(* m_systems) [MOVEMENT_SYSTEM]'을 사용해야합니다. –

+0

나는 그것을했지만 그 오류는 정확히 같다. – Urefeu

+0

접두사 관련 : 1.지도를 가리키는 것이 실수 일 수 있습니다. 2. 전체 디자인이 의심스러워 보입니다. 기본적으로 싱글 톤을 저장하는 맵이 필요한 이유는 무엇입니까? –

답변

0
std::unique_ptr<MovementSystem> mvt = *m_systems[MOVEMENT_SYSTEM]; 

이 줄에는 두 가지 문제가 있습니다. 하나는, 연산자 우선 순위는이 해석 얻을 것 등이다

*(m_systems[MOVEMENT_SYSTEM]) 

이것은 그 포인터 m_systems로 (AN "배열"의 MOVEMENT-SYSTEM th 요소 액세스 m_systems가 가리키는) 포인터 연산 적용 의미 그런 다음 해당 맵에 *을 적용하면됩니다.

(*m_systems)[MOVEMENT_SYSTEM] 

두 번째 문제는 고유 한 포인터를 복사하기 위해 노력하고 있다는 것입니다 : 당신이 원한이 있었다. 정확히 어떤 고유 포인터가 방지되도록 설계 되었습니까?

당신이 아마 단순히 포인터를 얻고, 그에 따라 그것을 캐스팅합니다 : 그것은 불필요한 포인터를 없애는 때문에

MovementSystem *mvt = static_cast<MovementSystem*>((*m_systems)[MOVEMENT_SYSTEM].get()); 

또는 더 나은을 :

auto &systems = *m_systems; 
auto &mvt = static_cast<MovementSystem&>(*systems[MOVEMENT_SYSTEM]); 
mvt.update(dt); 
+0

답변 해 주셔서 감사합니다. 첫 번째 문제는 수정되었으며 두 번째 문제는 더 이상 오류를 표시하지 않지만 프로그램이 충돌합니다.세 줄 앞에 넣은'cout'이 표시되지만 MovementSystem :: update()의 시작 부분은 표시되지 않습니다. 나는 한 쪽을 더 넣었고'static_cast' 줄에서 충돌했다. – Urefeu

+0

@Urefeu 다른 접근법 (다른 것을 가정 할 때 디버깅을해야 함), 잠재적으로 다른 [mcve] 등과 같이 다른 문제가있는 것처럼 보입니다. 프로그램을 단계별로 실행 해 보시고, 아마도'static_cast' 대신에'dynamic_cast'를 체크하십시오. 여전히 멈춘다면 발견 한 내용과 MCVE를 새로운 질문으로 게시하십시오. – Angew