【问题标题】:Make a number of objects available to user使一些对象可供用户使用
【发布时间】:2019-02-26 16:48:57
【问题描述】:

假设我建立了一个Note(音符)类(note.hnote.cpp)并想为我的图书馆的用户提供一组最常用的Note对象

Note a = Note('a');
Note b = Note('b');
Note c = Note('c');
...

如果用户想使用升 F,他/她需要创建一个 Note('f','sharp') 对象,但为了简单起见,我想提供最常见的根音符作为对象。

有什么可能(和推荐的)方法来实现这一目标?

1) 使用带有extern 声明的头文件和相应的实现文件? (甚至可能是note.hnote.cpp 文件?)

2) 提供静态类方法,如Note Note::a() {return Note('a');} 等。(虽然这种方法对我来说有点冗长......)。

其他解决方案?

【问题讨论】:

  • 开发库是最复杂的任务(比开发应用程序困难得多)。有太多变种,我怀疑是否有“推荐”的方式。这取决于整个库的设计。
  • enums 似乎是为此而生的。 (对于构造函数的参数,我的意思是)
  • 您可能有兴趣查看Flyweight Pattern

标签: c++ oop object


【解决方案1】:

user-defined literals1

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

这让你可以写出非常棒的东西,比如:

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

Full example program


1 如果Note 符合条件,则定义constexpr 运算符。

【讨论】:

  • 很好,我从未听说过这个概念,并且一定会更深入地研究它,谢谢!
【解决方案2】:

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

如果存在静态初始化顺序问题,我会使用像你这样的小静态辅助函数。

【讨论】:

  • 我可以建议将 conexpr 用户定义的文字添加到组合中吗?这将是一个很好的语法play("A#"_n + "Fb"_n, 1s); :)
  • @YSC,你可以,但我不会这样做)))。原因是当代码用户完全不知道那些 constexpr 文字正在被 ODR 使用时,我厌倦了突然的 ODR 问题。
  • 谁会??!?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2022-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多