C++ 为什么我的单身人士无法保持会员价值

C++ Why is my singleton not maintaining member value

本文关键字:会员价 为什么 我的 单身 C++      更新时间:2023-10-16

我正在学习C++,我正在尝试实现一个单例。代码如下:

#include <string>
#include <iostream>
class Configuration{
    Configuration(){
        languageName = "English";
    };
    public:
    std::string languageName;
    static Configuration& instance(){
        static Configuration _instance;
        return _instance;
    }
};
int main(){
    auto config = Configuration::instance();
    config.languageName = "Deutsch";
    std::cout<<config.languageName<<std::endl;//Deutsch
    auto config2 = Configuration::instance();
    std::cout<<config.languageName<<std::endl;//Deutsch
    std::cout<<config2.languageName<<std::endl;//English
    std::cout<<(&config == &config2)<<std::endl;//0
}

我期望如果我在一个实例上设置语言的值,则第二个实例将持有相同的值,因为两个实例实际上是相同的。

但是在上面的代码中,config2config有不同的languageName值。这是什么原因呢?我正在遵循教程中的代码。

两个实例实际上是相同的

不,它们不是同一个实例。即使返回引用Configuration::instance()main()中的变量也不会声明为引用,因此将复制返回的引用。您需要将它们声明为引用以避免复制。如

auto& config = Configuration::instance();
    ~
auto& config2 = Configuration::instance();
    ~

顺便说一句:为了确保只有一个实例,您可能需要delete复制/移动构造函数和赋值运算符。