假设我建立了一个var letterPoints = new Dictionary<char, int>()
{
{'A', 1}, {'B', 2}, {'C', 3}, {'D', 1}, {'E', 1}, {'F', 4}, {'G', 2}, {'H', 2}, {'I', 1}, {'J', 4},
{'K', 4}, {'L', 2}, {'M', 3}, {'N', 1}, {'O', 1}, {'P', 3}, {'Q', 10}, {'R', 1}, {'S', 1}, {'T', 1},
{'U', 4}, {'V', 2}, {'W', 4}, {'X', 8}, {'Y', 8}, {'Z', 4}
};
foreach (var lp in letterPoints)
{
lblAlfabet.Content += $"{lp.Key}={lp.Value}\n";
}
(音符)类(Note
,note.h
),并想为我的图书馆用户提供一组最常用的{{1} }个对象
note.cpp
如果用户想使用F锐笔,则需要创建一个Note
对象,但是为了简单起见,我想提供最常见的根音作为对象。
有什么可能(和推荐的)方法来实现这一目标?
1)使用带有Note a = Note('a');
Note b = Note('b');
Note c = Note('c');
...
声明的头文件和相应的实现文件? (也许甚至是Note('f','sharp')
,extern
个文件?)
2)提供静态类方法,例如note.h
等(尽管这种方法对于我的口味来说很冗长...)。
其他解决方案?
答案 0 :(得分:4)
去here 1 :
Note operator "" _note(char const* value, std::size_t) { return Note{value}; }
这使您可以编写一些非常好的东西,例如:
play("A#"_note + "Fb"_note + "G"_note, 1s);
1 如果Note
符合条件,则定义一个Full example program运算符。
答案 1 :(得分:1)
如果C ++ 17可用,并且静态初始化顺序不是问题,那么我将使用inline
变量。如果C ++ 17不可用,但是静态初始化顺序仍然不是问题,我将在.cpp文件中使用extern
声明和定义。
如果存在静态初始化顺序的问题,我将使用一些静态辅助函数,例如您的函数。
答案 2 :(得分:0)
您可以在Note类中使用静态成员变量。带有{note-type-> count}的地图也许就足够了?您必须在构造函数中处理计数器,但类用户将看不见它。然后,您可以为用户添加静态访问方法以提取数据。如果您或您的用户使用多线程,请记住要保护对静态映射的访问。