Código C++:
Ver originalclass IconoSexo
{
public:
static IconoSexo& getIcon();
int male();
int female();
};
Con esa interfaz es imposible recuperar los iconos ya que no hay ningún método público que devuelva un QIcon.
Por otro lado es poco práctico tener un método exclusivo para cada icono a devolver. En su lugar es mejor declarar un enumerado:
Código C++:
Ver originalenum class IconosSexo
{
Undefined,
Male,
Female
};
class IconoSexo
{
public:
static IconoSexo& getIcon();
QIcon GetIcon(IconosSexo tipo);
};
Aunque quizás sería más adecuado disponer de un único reservorio de iconos en vez de ir creando clases como si fuesen champiñones. Además para este uso no veo necesario crear un singletone. A mi modo de ver es más práctico tener una clase estática.
Código C++:
Ver originalenum IconType
{
Undefined,
Male,
Female,
AnotherOne,
};
class IconWareHouse
{
public:
static QIcon GetIcon(IconType type)
{
auto it = _icons.find(type);
if( it == _icons.end() )
{
// algoritmo para cargar el icono
// ...
// Se añade el icono a la caché
it = _icons.insert(std::make_pair(type,icon));
}
return it->second;
}
private:
static std::map<IconType,QIcon> _icons;
};
En cuanto al fallo que comentas al usar el singletone, el problema es que estás intentando hacer una copia de la clase, cosa que al ser singleton no está permitido.
Deberías recuperar una referencia en ese caso.
Eso sí, nota que las variables creadas como referencia únicamente se pueden asignar una vez y que la misma ha de realizarse en la creación de la variable. Necesitarías algo así:
Código C++:
Ver originalclass MiModel
{
IconosSexo& icono;
MiModel::MiModel(QObject *parent):QAbstractTableModel(parent)
: icono(IconoSexo::getIcon())
{
rellenarLista();
}
};
Aunque quizás lo más recomendable sería crear una variable local cuando la necesites:
Código C++:
Ver originalvoid MiModel::rellenarLista()
{
auto& icon = IconoSexo::getIcon();
// ...
}
Todo esto suponiendo que no optas por convertir el repositorio de iconos en una clase estática... en ese caso no será necesario almacenar referencias en ningún sitio.
PD.: También podrías almacenar un puntero a la instancia, aunque no es una acción recomendable:
Código C++:
Ver originalIconoSexo* ptr = &IconoSexo::getIcon();
Un saludo.