初始化一个 C++ 11 风格的单例
Initializing a c++ 11 style singleton
假设我有一个单身人士 class App
我获得了其中的实例 via:
App& App::get()
{
static App instance;
return instance;
}
根据我的研究,当需要单例时,这显然是获取实例的最佳方式。但是假设我需要在初始实例化期间传递一次值,例如:
void App::init(bool someValue)
{
static App instance(someValue);
}
我在这个概念上苦苦挣扎的地方是,我如何才能通过 get()
方法获得该实例,而不必每次都传递 someValue
?
过去在 init()
中,我会简单地使用构造函数创建一个 App
实例,传递初始化值并将该实例作为静态成员保存到 App class,然后 get()
会 return 那个单一的实例。我似乎无法弄清楚如何将这种行为转化为这种新范式。实现此目标的最佳方法是什么?
嗯,你可以有一个静态指针指向 init
中的本地静态实例:
// App.hpp
#include <cassert>
class App {
public:
static void init(bool const b) noexcept {
static App ap{b};
_inst = ≈
}
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();
}
假设我有一个单身人士 class App
我获得了其中的实例 via:
App& App::get()
{
static App instance;
return instance;
}
根据我的研究,当需要单例时,这显然是获取实例的最佳方式。但是假设我需要在初始实例化期间传递一次值,例如:
void App::init(bool someValue)
{
static App instance(someValue);
}
我在这个概念上苦苦挣扎的地方是,我如何才能通过 get()
方法获得该实例,而不必每次都传递 someValue
?
过去在 init()
中,我会简单地使用构造函数创建一个 App
实例,传递初始化值并将该实例作为静态成员保存到 App class,然后 get()
会 return 那个单一的实例。我似乎无法弄清楚如何将这种行为转化为这种新范式。实现此目标的最佳方法是什么?
嗯,你可以有一个静态指针指向 init
中的本地静态实例:
// App.hpp
#include <cassert>
class App {
public:
static void init(bool const b) noexcept {
static App ap{b};
_inst = ≈
}
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();
}