隐藏的单例,用于封装初始化和销毁代码
Hidden singleton to encapsulate initialization and destruction code
我有一个需要手动初始化和销毁的库,我想使该过程自动化。由于 init 和 quit 函数都应该只调用一次,我认为一个好的解决方案是使用单例,但由于调用Singleton::instance().func()
调用每个函数很烦人,所以我在 cpp 文件中实现了单例并使用标头中的函数作为单例方法的包装器。
框架.h
namespace framework {
//void init(); // want this to be automatic.
//void quit();
float func1();
void func2(int i);
//...
}
框架.cpp
namespace framework
{
class Framework
{
private:
Framework() {
//init code
//...
}
~Framework() {
//quit code
//...
}
public:
Framework(const Framework&) = delete;
Framework& operator=(const Framework&) = delete;
static Framework& instance() {
static Framework result; //on first call initialization code is run.
return result;
}
float func1() {
//...
}
void func2(int i) {
//...
}
};
// wrapper functions
float func1() {
return Framework::instance().func1();
}
void func2(int i) {
Framework::instance().func2(i);
}
}
除了使用常规单例时可能发生的一般问题之外,此设计是否存在任何问题?
这个设计有什么问题吗...
好吧,链接器有可能与在其他地方声明/定义的另一个类framework::Framework
歧义发生冲突。
您应该将该单例封装到翻译单元中的匿名/未命名命名空间中:
namespace { // <<<< Guarantees that everything within this is only
// visible within this translation unit, even when linking that code.
class Framework
{
private:
Framework() {
//init code
//...
}
~Framework() {
//quit code
//...
}
public:
Framework(const Framework&) = delete;
Framework& operator=(const Framework&) = delete;
static Framework& instance() {
static Framework result; //on first call initialization code is run.
return result;
}
float func1() {
//...
}
void func2(int i) {
//...
}
};
}
namespace framework
{
// wrapper functions
float func1() {
return Framework::instance().func1();
}
void func2(int i) {
Framework::instance().func2(i);
}
}
相关文章:
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 初始化正在影响与初始化无关的代码
- 开始多线程代码之前的初始化
- 在静态初始化期间运行代码
- 获取有关使用未初始化内存的错误代码
- 聚合初始化,clang想让我破坏代码吗
- 在运行时,何时完全初始化 std 库才能在不破坏代码的情况下使用它?
- 初始化代码的组织
- 初始化不可移动对象数组:为什么这样的代码无法在 GCC 上编译?
- 此代码中的数组初始化样式是什么?这是标准的吗?
- 为什么 GCC 6.3 在没有显式 C++11 支持的情况下编译此大括号初始化列表代码
- 程序告诉我初始化在编写简单的C ++代码时不需要初始化的变量
- 在通用模板代码中初始化聚合成员
- 如何初始化共享复杂初始化代码的多个常量成员变量?
- 为什么单一实例必须在以下代码中初始化
- 在构造函数代码之前禁用默认类成员初始化
- 隐藏的单例,用于封装初始化和销毁代码
- C 在代码中初始化字符串变量时无控制台输出
- 避免复制粘贴代码初始化结构中的一系列SDL_Rect
- 如何在编译时或代码初始化时自动更新数组中的项