メンバーがキーと値である要素の配列を使用するだけで、軽量マップを実装しようとしています。マップの内容はコンパイル時にわかっているので、次のように固定サイズの配列を使用することを考えています。
#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();
}
私の質問に: コード スニペットは意図したとおりに動作しますが、ItemMapUser::map で使用する前に ITEM1 から ITEM4 のコンテンツを初期化する初期化順序に依存しているように感じます。このトピックに関する多くの質問 (特に static-order-fiasco タグが付いているもの) を検索しましたが、配列の使用に関連するものは見つかりませんでした。
- 初期化命令の失敗に遭遇する可能性はありますか?
- いいえの場合、ここでの発生を妨げているのは何ですか?
- 配列を使用していることは重要ですか?
const Item anotherItem = ITEM1;
たとえば、単純な変数を初期化しようとすると、どのようになりますか?