C++ 我如何重新初始化单身人士?
我知道这听起来很奇怪,但我想重新初始化一个单例,将其所有变量设置回默认值。 我有以下的单身班:C++ 我如何重新初始化单身人士?,c++,c++17,C++,C++17,我知道这听起来很奇怪,但我想重新初始化一个单例,将其所有变量设置回默认值。 我有以下的单身班: class Singleton { public: static Singleton &getInstance(){ static Singleton instance; return instance; } Singleton(const Singleton &) = delete
class Singleton {
public:
static Singleton &getInstance(){
static Singleton instance;
return instance;
}
Singleton(const Singleton &) = delete;
Singleton(Singleton &&) = delete;
Singleton &operator=(const Singleton &) = delete;
Singleton &operator=(Singleton &&) = delete;
static void clearSingleton(){
//Recreate instance object??
}
int a = 0;
int b = 0;
int c = 0;
//etc...
}
我的程序对变量进行了大量更改,如:
Singleton::getInstance().a = 5;
Singleton::getInstance().b = 8;
//etc...
过了一会儿,我需要重置所有变量。我当然可以在单例中添加一个重置函数来设置所有变量,但由于变量太多,很容易忘记向重置函数添加新变量,我只想删除单例并重新创建它。在这种情况下,所有变量将自动重置。
如何执行此操作?如果您只是默认移动分配操作符,但将其设置为私有:
class Singleton {
Singleton &operator=(Singleton &&) = default;
public:
// ...
};
你可以写:
static void clearSingleton() {
getInstance() = Singleton{};
}
这是一个例子
您可以对所有特殊成员函数执行此操作,以便保持一致。如果您只是默认移动分配运算符,但将其设置为私有:
class Singleton {
Singleton &operator=(Singleton &&) = default;
public:
// ...
};
你可以写:
static void clearSingleton() {
getInstance() = Singleton{};
}
这是一个例子
您可以对所有特殊成员函数执行此操作,因此为了保持一致,您也可以这样做。不能对这样设计的类执行此操作,因为getSingleton方法是变量位于作用域中的唯一位置。如果您返回了一个共享的ptr,则可以使用一个新实例重置它。或者,您可以将其设置为具有访问器函数的名称空间,而不是类。要补充的是,需要重置一个单例表明,这不应该是一个单例。假设您已经研究了为什么单例设计模式通常被认为不好,那么您决定用单例解决什么问题?你为什么选择一个单身的解决方案?你想通过重置singleton实例来解决什么问题?我不是在推广singleton,但这次我不得不处理它。简单的回答是,在代码中的不同位置使用了Singleton,我不想碰它,我需要重置它的所有变量。为了获得一个快捷方式,而不必添加一个会重置每个变量的函数,我只想重新创建singleton。一种选择是自己管理内存,但这很危险。不能对这样设计的类执行此操作,因为getSingleton方法是变量位于作用域中的唯一位置。如果您返回了一个共享的ptr,则可以使用一个新实例重置它。或者,您可以将其设置为具有访问器函数的名称空间,而不是类。要补充的是,需要重置一个单例表明,这不应该是一个单例。假设您已经研究了为什么单例设计模式通常被认为不好,那么您决定用单例解决什么问题?你为什么选择一个单身的解决方案?你想通过重置singleton实例来解决什么问题?我不是在推广singleton,但这次我不得不处理它。简单的回答是,在代码中的不同位置使用了Singleton,我不想碰它,我需要重置它的所有变量。为了获得一个快捷方式,而不必添加一个会重置每个变量的函数,我只想重新创建singleton。一种选择是自己管理内存,但这很危险。这比我的答案更简单,可能更好,但值得注意的是,将赋值操作符私有化有一些奇怪的副作用,即它们可以在重载解析期间找到,并导致构建失败。它们几乎从来都不是真正的问题,但它们确实存在。@MooingDuck这很有趣,谢谢你指出这一点。谢谢你,cigien,这对我来说非常有效。这正是我想要的解决方案。感谢Mooning Duck的警告。这比我的回答更简单,可能更好,但值得注意的是,将赋值操作符私有化有一些奇怪的副作用,即它们可以在重载解析过程中找到,并导致构建失败。它们几乎从来都不是真正的问题,但它们确实存在。@MooingDuck这很有趣,谢谢你指出这一点。谢谢你,cigien,这对我来说非常有效。这正是我想要的解决方案。谢谢你的警告。