C ++ - Инициализация статической карты в качестве частного члена класса

Допустим, однажды поздно вечером мне было очень скучно, и я кататонически смотрел на компьютер monitor в течение нескольких часов, я решил реализовать совокупный класс C ++ для управления цветами для рисования пикселей, потому что я явно сошел с ума. Для начала мы просто сообщим объекту ColorManager (вероятно, одноэлементному), какой цвет мы хотим использовать, и он вернет объект Color, каким бы он ни был. Далее следует простая реализация:

#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;
};

Итак, надеюсь, этот простой код:

ColorManger colorManager;
Color blue = colorManager.getColor(BLUE);

должен упростить нам выполнение всякой ерунды, для которой вам понадобятся объекты Color.

Проблема в том, что вам нужно инициализировать ваша статическая частная карта ColorMap где-то так, чтобы каждое перечисление COLOR соответствовало правильному объекту Color, а VC ++ 2010, похоже, не нравится все, что вы пытаетесь. Итак, вопрос в том, как и где мне инициализировать эту карту?

Очевидно, это надуманный пример, но помимо этого, возможно, определение статических переменных для класса, который функционирует как синглтон, не стоит проблем. Или, возможно, я мог бы просто объявить переменную static внутри getColor ()так как это единственная функция, которая ее использует, и просто вызывает накладные расходы при первом вызове функции (хотя для этого простого примера это не намного лучше, чем просто поместить туда гигантский оператор switch). В любом случае, я ценю обратную связь.

18
задан Shaun 2 June 2011 в 19:30
поделиться

1 ответ

#include <map>
#include "Color.h"

enum COLOR
{
    RED = 0, BLUE, GREEN, YELLOW, ORANGE, WHITE, BLACK,
    BRICKS_FROM_A_DISTANCE_ON_AN_UNUSUALLY_SUNNY_AFTERNOON,
    // etc
    COLOR_COUNT
};

class ColorManager
{
    typedef std::map<COLOR, Color> ColorMap;

public:
    ColorManager();
    Color getColor(COLOR color) const;

private:
    static ColorMap createColorMap();
    static ColorMap colorMap;
};

// in some .cpp file:

ColorManager::ColorMap ColorManager::createColorMap()
{
    ColorMap ret;
    // populate ret
    return ret;
}

ColorManager::ColorMap ColorManager::colorMap = ColorManager::createColorMap();

Или с C ++ 11:

#include <map>
#include "Color.h"

enum COLOR
{
    RED = 0, BLUE, GREEN, YELLOW, ORANGE, WHITE, BLACK,
    BRICKS_FROM_A_DISTANCE_ON_AN_UNUSUALLY_SUNNY_AFTERNOON,
    // etc
    COLOR_COUNT
};

class ColorManager
{
    using ColorMap = std::map<COLOR, Color>;

public:
    ColorManager();
    Color getColor(COLOR color) const;

private:
    static ColorMap colorMap;
};

// in some .cpp file:

ColorManager::ColorMap ColorManager::colorMap = []
{
    ColorMap ret;
    // populate ret
    return ret;
}();
15
ответ дан 30 November 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: