向用户提供许多对象

时间:2019-02-26 16:48:57

标签: c++ oop object

假设我建立了一个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"; } (音符)类(Notenote.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等(尽管这种方法对于我的口味来说很冗长...)。

其他解决方案?

3 个答案:

答案 0 :(得分:4)

here 1

Note operator "" _note(char const* value, std::size_t) { return Note{value}; }

这使您可以编写一些非常好的东西,例如:

play("A#"_note + "Fb"_note + "G"_note, 1s);

user-defined literals


1 如果Note符合条件,则定义一个Full example program运算符。

答案 1 :(得分:1)

如果C ++ 17可用,并且静态初始化顺序不是问题,那么我将使用inline变量。如果C ++ 17不可用,但是静态初始化顺序仍然不是问题,我将在.cpp文件中使用extern声明和定义。

如果存在静态初始化顺序的问题,我将使用一些静态辅助函数,例如您的函数。

答案 2 :(得分:0)

您可以在Note类中使用静态成员变量。带有{note-type-> count}的地图也许就足够了?您必须在构造函数中处理计数器,但类用户将看不见它。然后,您可以为用户添加静态访问方法以提取数据。如果您或您的用户使用多线程,请记住要保护对静态映射的访问。