You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++私有构造函数实现单例类时实例value值不一致问题排查

问题核心原因

你的单例本身逻辑是对的,问题出在实例接收的写法上:

  • SortOfSingleton::getInstance() 返回的是 SortOfSingleton& 引用类型,但使用 auto 直接接收返回值时,auto的默认类型推导会丢弃引用修饰符,最终instance1、instance2的类型都是独立的SortOfSingleton对象,不是指向静态单例的引用。
  • 代码会调用编译器自动生成的默认拷贝构造函数,把全局唯一的静态单例拷贝出一份新的栈上对象,你修改instance1.value改的是这个拷贝对象的值,完全没有影响到原静态单例的value属性,所以第二次获取的原单例value还是初始值5。
修复方案

快速修复

直接把实例接收的部分改成引用接收即可,auto显式加&修饰:

auto& instance1 = SortOfSingleton::getInstance();
instance1.value = 100;
std::cout << instance1.value << std::endl;

auto& instance2 = SortOfSingleton::getInstance();
std::cout << instance2.value << std::endl;

更规范的单例实现

为了从根源避免不小心触发拷贝的问题,建议在单例类中显式删除拷贝构造和拷贝赋值函数,写错的时候编译器会直接报错提示:

class SortOfSingleton
{
public:
    static SortOfSingleton& getInstance();
    int value = 0;
    // 显式删除拷贝构造和拷贝赋值
    SortOfSingleton(const SortOfSingleton&) = delete;
    SortOfSingleton& operator=(const SortOfSingleton&) = delete;
private:
    SortOfSingleton(int value);
};

另外补充:C++标准规定main函数的返回值必须是int,void main是非标准写法,建议改成int main()。

内容的提问来源于stack exchange,提问作者Damn Vegetables

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:45:03