如何设计一个在初始化后保持不变的类,并且在我的整个程序中只存在一次

Mic*_*ael 7 c++ static design-patterns

我很确定以下问题在其他地方已经有了一个很好的答案,但很难找到,因为我不知道我的问题的"名称".

我正在设计一个具有以下属性的类/对象/"东西":

  • 它是一种查找表.
  • 初始化后它不会改变.
  • 它有几个非原始成员.
  • 它具有复杂的初始化函数.
  • 整个计划都是一样的.
  • 它由模板参数参数化.

所以这听起来像一个静态模板类:

template <int T>
class LookupTable{

  public:
    static void init(){
      // create entries depending on T
    }

  private:
    static vector<Entries> entries;

}
Run Code Online (Sandbox Code Playgroud)

我不喜欢的是我需要init()在我的程序中调用某个地方.所以第一个问题是:如何让这个类完全自包含,不需要在某个地方显式初始化?

第二部分:实现这样一个类的一般设计方法是什么?我很高兴看到一个很好的例子的链接.

一个可能的候选人是单身人士.但我有些疑惑: - 在许多情况下,单身人士认为设计不好.如上所述,查找表是否可以? - Singleton有点长,因为我必须使用LookupTable::getInstance()->getEntry(idx).

Jas*_*ton 5

Singleton是模式,但使用更安全的变体,这种方法避免了静态初始化顺序惨败和线程竞争条件,并且因为你抱怨长度 - 我们可以通过get_entry函数进一步缩短它的索引:

template <int T>
class LookupTable{
    public:
    static std::vector<Entry> make_entries(){ ...}
    static const std::vector<Entry>& get_entries(){
        static const std::vector<Entry> instances = make_entries();
        return instances;
    }
    static const Entry& get_entry(size_t idx){
        return get_entries()[idx];
    }
};
Run Code Online (Sandbox Code Playgroud)

避免单身人士所有邪恶的另一种方法是不使用单身人士 - 只需将常规旧类直接作为另一个参数传递.我使用相对繁重的表格进行许多crc函数实现...大多数东西都不会关心,然后你就不必在设计模式上掏空了.它更快.