我试图通过简单地使用其成员是键和值的元素数组来实现轻量级映射。地图内容在编译时是已知的,因此我考虑使用固定大小的数组,如下所示:
#include "stdafx.h"
#include <string>
// class Item is declared in file1.h. Definition could be in file1.cpp.
class Item
{
public:
Item(const std::string name) : m_name(name) {}
const std::string GetName() const { return m_name; }
private:
const std::string m_name;
};
// The static consts are declared in file2.h which includes file1.h.
static const Item ITEM1 = std::string("Item1");
static const Item ITEM2 = std::string("Item2");
static const Item ITEM3 = std::string("Item3");
static const Item ITEM4 = std::string("Item4");
// ItemMapEntry and ItemMapUser is defined in file3.h...
struct ItemMapEntry
{
const Item& key;
const Item& value;
};
class ItemMapUser
{
public:
void Run();
private:
static const ItemMapEntry map[];
};
// and declared in file3.cpp which includes file2.h.
const ItemMapEntry ItemMapUser::map[] =
{
{ ITEM1, ITEM2 },
{ ITEM3, ITEM4 }
};
void ItemMapUser::Run()
{
for (int i = 0; i < (sizeof(map) / sizeof(map[0])); i++)
{
printf("%s %s\n", map[i].key.GetName().c_str(), map[i].value.GetName().c_str());
}
}
// main.cpp includes file3.h.
int main()
{
ItemMapUser itemMapUser;
itemMapUser.Run();
}
现在我的问题是:代码片段按预期工作,但我不知何故有一种感觉,我依赖初始化顺序让 ITEM1 到 ITEM4 在使用 ItemMapUser::map 之前对其内容进行初始化。我搜索了许多与此主题相关的问题(尤其是那些带有 static-order-fiasco 标签的问题),但找不到与数组使用相关的任何问题。
- 会不会遇到初始化命令惨败?
- 如果不是,是什么阻止它在这里发生?
- 我使用数组是否重要?
const Item anotherItem = ITEM1;
如果我尝试使用例如初始化一个简单的变量会是什么样子?