Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我如何重新初始化单身人士?_C++_C++17 - Fatal编程技术网

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,这对我来说非常有效。这正是我想要的解决方案。谢谢你的警告。