C++ - 将静态映射初始化为私有类成员

Sha*_*aun 18 c++ static stl map

让我说我在一个傍晚非常无聊,经过几天的时间盯着电脑显示器,我决定实现一个聚合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;
};
Run Code Online (Sandbox Code Playgroud)

所以,希望这个简单的代码:

ColorManger colorManager;
Color blue = colorManager.getColor(BLUE);
Run Code Online (Sandbox Code Playgroud)

应该让我们真的很容易做任何你需要颜色对象的废话.

问题是您需要在某处初始化静态私有ColorMap,以便每个COLOR枚举对应一个正确的Color对象,VC++ 2010似乎不喜欢您尝试的任何东西.所以问题是,我如何以及在何处初始化此地图?

显然,这是一个人为的例子,但除此之外,或许为一个作为单例的类定义静态变量并不值得.或者,也许,我可能只是在getColor()中声明变量static,因为这是使用它的唯一函数,并且只是在第一次调用函数时产生开销(尽管对于这个简单的例子,这并不是更好)而不只是在那里放一个巨大的开关声明).无论如何,我都很感激反馈.

ild*_*arn 15

#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();
Run Code Online (Sandbox Code Playgroud)

或者使用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;
}();
Run Code Online (Sandbox Code Playgroud)


HC4*_*ica 7

std :: map有一个构造函数,它将一对迭代器作为参数,因此您可以使用例如一对数组初始化映射:

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

using std::make_pair;
using std::pair;

std::pair<COLOR, Color> colorPairs[] = {make_pair(RED, Color(...)),
                                        make_pair(BLUE, Color(...)),
                                        make_pair(GREEN, Color(...)),
                                        ...};

ColorManager::ColorMap ColorManager::colorMap(colorPairs, colorPairs + COLOR_COUNT);
Run Code Online (Sandbox Code Playgroud)

在C++ 0x中,您将能够简单地执行此操作:

ColorManager::ColorMap ColorManager::colorMap({{RED, Color(...)},
                                               {BLUE, Color(...)},
                                               {GREEN, Color(...)},
                                               ...});
Run Code Online (Sandbox Code Playgroud)


And*_*ner 6

使用静态方法创建初始化映射:

ColorManager::colorMap(ColorManager::makeColorMap());
Run Code Online (Sandbox Code Playgroud)

makeColorMap以下静态方法在哪里:

ColorManager::ColorMap ColorManager::makeColorMap()
{
  ColorMap retval;
  retval[...] = ...;
  retval[...] = ...;
  ...

  return retval; 
}
Run Code Online (Sandbox Code Playgroud)