c++ - 初始化C++ 11风格的单例

标签 c++ c++11 singleton

说我有一个单例类App,我通过它获取了via的实例:

App& App::get()
{
    static App instance;
    return instance;
}

根据我的研究,当需要单例时,这显然是获得实例的最佳方法。但是,假设我需要在初始实例化期间传递一次值,例如:
void App::init(bool someValue)
{
    static App instance(someValue);
}

我在这个概念上苦苦挣扎的地方是如何通过get()方法获取该实例,而不必每次都传递someValue

过去在init()中,我只是使用构造函数创建一个App实例,传递初始化值并将该实例保存为App类的静态成员,然后get()将返回该单个实例。我似乎很难弄清楚如何将这种行为转化为新的范例。做到这一点的最佳方法是什么?

最佳答案

好吧,您可能有一个静态指针,它指向init中的本地静态实例:

// App.hpp
#include <cassert>

class App {
public:
    static void init(bool const b) noexcept {
        static App ap{b};
        _inst = &ap;
    }

    static App& get() noexcept {
        assert(_inst);
        return *_inst;
    }
private:
    App(bool const b)
        : _b{ b }
    {}

    bool _b;
    static App* _inst;
};

// App.cpp

App* App::_inst = nullptr;

// main.cpp

int main() {
    App::init(true);
    auto& ap = App::get(); 
}

关于c++ - 初始化C++ 11风格的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61717851/

相关文章:

c++ - OpenACC CPU 与 GPU 优化

c++ - 合并排序中的递归调用

c++ - 如何从指向方法的指针获取类(对象类型)

c++ - 将临时 std::shared_ptr 插入到 std::map 中,这不好吗?

c++ - std::enable_if 的两个版本有什么区别

python - 为什么这个单例实现是 "not thread safe"?

c++ - "rvalue references for *this"是做什么用的?

c++ - 避免多个互斥锁以保护类似的竞争条件

scala - Scala中单例对象的解释

java - Spring 单例 bean 如何工作?