我正在开发一个 C++ 项目(Embarcadero C++ Builder),其中许多类(都在同一个命名空间中)需要从颜色名称中获取颜色值。为了实现这一点,我在单独的代码 Tools.cpp 中创建了一个所有类都使用的函数 getColorCode(),如下所示:
#include "Tools.h"
namespace mynamespace {
int getColorCode(std::string Name)
{
if (Name == "red") return(0xFF0000);
else if (Name == "green") return(0x00FF00);
else if (Name == "blue") return(0x0000FF);
// many more else ifs
else return(0x000000);
}
}
头文件是:
#ifndef MYNAMESPACE_TOOLS_H
#define MYNAMESPACE_TOOLS_H
#include <string>
namespace mynamespace {
int getColorCode(std::string Name);
}
#endif
这可行,但我希望将所有颜色定义存储在地图中以避免数百个 else if。我的问题是,如果不到达定义地图的行,我就无法std::map<std::string, int> ColorNames;
在 Tools.cpp 的头文件中定义类似的东西。W8058 Cannot create pre-compiled header
此外,我收到几个链接器警告,表明 mynamespace::ColorNames 在包括 Tools.h 在内的每个类中都定义了。
我的计划是在第一次调用 getColorCode() 时通过检查 map.empty() 来填充地图,并将所有颜色名称和代码添加到其中,如果它是空的,那么进一步的调用只会搜索地图。
另一种尝试是为此创建一个工具类并在构造函数中初始化地图。但是每个使用它的类都会创建一个它自己的实例,这是我不想要的。阅读关于单例的讨论并尝试提出的代码并没有帮助。
是否有任何实用的方法来实现这一点,或者我应该留在丑陋的(非性能)if-then-else 链中吗?
感谢您的任何提示,阿明