为什么这个单例实现使用私有类(C ++)?

时间:2016-12-29 09:56:32

标签: c++ class singleton

所以我正在使用供应商应用程序中的一些新代码,我发现对于他们的一个库,他们使用的是Singleton模式。在那里,他们使用Helper来实例化单例。为什么这有必要?

库头文件:

Class LibExample {

public:
    static LibExample* getInstance();

private:
    class Helper {
    public:
        Helper() {
            libExampleInstance = new LibExample();
        }
        ~Helper() {
            delete libExampleInstance;
        }

        LibExample* libExampleInstance;
     };

    static LibExample* m_instance;

    LibExample();
    virtual ~LibExample();
    LibExample (const LibExample& ) {};
    LibExample& operator=(const LibExample&) {
        return *(LibExample::getInstance());
    }
};

在.cpp文件中:

LibExample* LibExample::m_instance = NULL;

LibExample* LibExample::getInstance() {
    static Helper instance;
    if(m_instance == NULL) {
        m_instance = instance.libExampleInstance;
        int ret = m_instance->init();
        if(ret < 0) {
           m_instance = NULL;
        }
    }
    return m_instance;
}

1 个答案:

答案 0 :(得分:2)

  

他们在那里使用帮助者&#39;实例化单身人士。为什么这有必要?

不是。此处Helper可用于m_instance == NULL测试,并在首次使用init时调用getInstance,但init可能已在{{1}中运行也是构造函数。可能有一个不明原因,但恕我直言,这个设计只是过于复杂。

你可以:

LibExample

修改

@SingerOfTheFall在评论中指出:

  

我认为这是为了实现某种类型的后期初始化:如果Class LibExample { public: static LibExample* getInstance(); private: LibExample(); virtual ~LibExample(); LibExample (const LibExample& ) {}; LibExample& operator=(const LibExample&) { return *(LibExample::getInstance()); } }; LibExample* LibExample::getInstance() { static LibExample instance; static LibExample* p_instance = NULL; if(p_instance == NULL) { int ret = instance.init(); if(ret >= 0) { p_instance = &instance; } } return p_instance; } 第一次失败,单例本身不需要重新构建,它会尝试重新构建下次调用实例时初始化自己。

不需要init():我相应地修改了我的代码。