Digamos que estaba bastante aburrido una tarde por la noche y después de mirar catatónicamente el monitor de la computadora por unas horas, decidí implementar una clase agregada de C++ para administrar colores para dibujar píxeles porque obviamente me he vuelto loco Para empezar, le diremos al objeto ColorManager (probablemente único) el color que queremos usar y devolverá un objeto Color, cualquiera que sea. Una sencilla IMPLEMENTACIÓN sigue:C++ - Inicializando un mapa estático como miembro de clase privada
#include "Color.h"
#include <map>
enum COLOR { RED = 0, BLUE, GREEN, YELLOW, ORANGE, WHITE, BLACK,
BRICKS_FROM_A_DISTANCE_ON_AN_UNUSUALLY_SUNNY_AFTERNOON,
// etc
COLOR_COUNT };
class ColorManager
{
public:
ColorManager();
~ColorManager();
Color getColor(COLOR color) const;
private:
typedef std::map<COLOR, Color> ColorMap;
static ColorMap colorMap;
};
Por lo tanto, es de esperar, este código simple:
ColorManger colorManager;
Color blue = colorManager.getColor(BLUE);
debería hacer que sea muy fácil para nosotros hacer cualquier tontería para el que se necesitaría objetos de color.
El problema es que debe inicializar su ColorMap privado estático en alguna parte para que cada ENUM de COLOR corresponda a un objeto Color adecuado, y no parece que VC++ 2010 le guste nada de lo que intenta. Entonces, la pregunta es, ¿cómo y dónde inicializo este mapa?
Obviamente, este es un ejemplo artificial, pero más allá de eso, quizás la definición de variables estáticas para una clase que funciona como singleton no vale la pena. O, quizás, también podría declarar la variable estática dentro de getColor() ya que esa es la única función que lo usa, y solo incurrir en la sobrecarga la primera vez que se llama a la función (aunque para este simple ejemplo, eso no es mucho mejor) que simplemente poner una declaración de cambio gigante allí). En cualquier caso, agradezco los comentarios.
en VS2010, esto provoca una violación de acceso de memoria en tiempo de ejecución XTree, presumiblemente cuando los valores se asignan en el constructor de la clase. Sin embargo, compila. – Shaun
@SHaun obviamente está haciendo algo mal en el constructor ... Tenga cuidado de no confiar en otras variables estáticas. – littleadv