Ver Mensaje Individual
  #9 (permalink)  
Antiguo 16/09/2016, 01:11
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Qt.QTableView. Varias dudas

Cita:
Iniciado por dehm Ver Mensaje
La cosa es que no he pillado la idea de la clase que planteas. Es decir, estas líneas, qué han de hacer?:
Código C++:
Ver original
  1. if( it == _icons.end() )
  2. {
  3.   // algoritmo para cargar el icono
  4.   // ...
  5.  
  6.   // Se añade el icono a la caché
  7.   it = _icons.insert(std::make_pair(type,icon));
  8. }
se supone que la clase que actua como proveedor de iconos debe inicializar la colección en algún momento.

La colección puedes inicializarla bajo demanda o completa del tirón y cada opción se programa de una forma diferente.

En el caso de cargar todos los iconos de una vez podría ser algo tal que (aprovechando el código que has hecho):

Código C++:
Ver original
  1. enum class Sexo
  2. {
  3.     undefined, male, female
  4. };
  5.  
  6. class IconoWareHouse
  7. {
  8.     // Clase estática. No debe tener constructores disponibles
  9.     IconoWareHouse() = delete;
  10.  
  11.   public:
  12.     static std::string GetIcon(Sexo type)
  13.     {
  14.       auto it = _icons.find(type);
  15.  
  16.       if( it == _icons.end() )
  17.         it = _icons.find(Sexo::undefined);
  18.  
  19.       return it->second;
  20.     }
  21.  
  22.   private:
  23.     static std::map<Sexo,std::string>_icons;
  24.  
  25.     static decltype(_icons) InitMap()
  26.     {
  27.       // Opción con inicializadores de lista
  28.       return decltype(_icons){ std::make_pair(Sexo::undefined,"error"),
  29.                                std::make_pair(Sexo::male,"niño"),
  30.                                std::make_pair(Sexo::female,"niña") };
  31.     }
  32. };
  33.  
  34. std::map<Sexo,string> IconoWareHouse::_icons(InitMap());

Nota el uso de decltype para evitar repetir todo el rato la declaración del mapa. Piensa que no suele ser adecuado repetir un tipo cada dos por tres porque luego al intentar portar la solución a Qt te obliga a hacer demasiados cambios.

También puedes usar typedef o using (typedef sirve para estándares anteriores a C++11):



Código C++:
Ver original
  1. class IconoWareHouse
  2. {
  3.     // Clase estática. No debe tener constructores disponibles
  4.     IconoWareHouse() = delete;
  5.  
  6.   public:
  7.  
  8.     // Alias declarado con typedef
  9.     typedef std::map<Sexo,std::string> IconsMap;
  10.  
  11.     // Alias declarado con using
  12.     using IconsMap = std::map<Sexo,std::string>;
  13.  
  14.     static std::string GetIcon(Sexo type)
  15.     {
  16.       auto it = _icons.find(type);
  17.  
  18.       if( it == _icons.end() )
  19.         it = _icons.find(Sexo::undefined);
  20.  
  21.       return it->second;
  22.     }
  23.  
  24.   private:
  25.     static IconsMap_icons;
  26.  
  27.     static IconsMap InitMap()
  28.     {
  29.       // Opción con inicializadores de lista
  30.       return IconsMap{ std::make_pair(Sexo::undefined,"error"),
  31.                        std::make_pair(Sexo::male,"niño"),
  32.                        std::make_pair(Sexo::female,"niña") };
  33.     }
  34. };

Por cierto, nota que make_pair es más cómodo y limpio que tener que hacer una declaración explícita de pair cada vez que insertas un elemento en el mapa.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.