C++ Polymorphism - Map of inherited classes -


i have movementsystem class inherits system class. later have number of xxxsystem classes store instances of xxxsystem (there 1 instance per system) in map way:

enum {     movement_system };  std::map<int,std::unique_ptr<system>> systems; systems[movement_system] = std::unique_ptr<system>(new movementsystem());  m_entitymanager.loadsystems(&systems); 

the last line there because need class entitymanager have access systems.

therefore have method:

std::map<int,std::unique_ptr<system>> *m_systems; // line in header  void entitymanager::loadsystems(std::map<int,std::unique_ptr<system>> *systems) {     m_systems = systems; } 

and in other method of entitymanager try access systems have sent class way:

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

but error:

conversion 'std::map<int, std::unique_ptr<system> >::mapped_type {aka std::unique_ptr<system>}' non-scalar type 'std::unique_ptr<movementsystem>' requested 

how can fix , last line call update method movementsystem?

std::unique_ptr<movementsystem> mvt = *m_systems[movement_system]; 

there 2 problems line. one, operator precedence such interpreted this:

*(m_systems[movement_system]) 

this means apply pointer arithmetic pointer m_systems (accessing movement-systemth element in "array" pointed m_systems) , apply * map, nonsense. wanted this:

(*m_systems)[movement_system] 

the second problem you're trying copy unique pointer. precisely unique pointers designed prevent.

what want pointer, , cast accordingly:

movementsystem *mvt = static_cast<movementsystem*>((*m_systems)[movement_system].get()); 

or, better because gets rid of unnecessary pointers:

auto &systems = *m_systems; auto &mvt = static_cast<movementsystem&>(*systems[movement_system]); mvt.update(dt); 

Comments

Popular posts from this blog

sequelize.js - Sequelize group by with association includes id -

android - Robolectric "INTERNET permission is required" -

java - Android raising EPERM (Operation not permitted) when attempting to send UDP packet after network connection -