具有可变成员的单例对象

时间:2011-10-28 19:52:41

标签: c++ static singleton mutable

编辑:看看GWW的答案,问题只是用C :: Instance()制作一份非法拷贝。我错了,错误不依赖于可变性。

静态方法是否与可变方法不兼容?这是我的代码的简化版本:

c.h:

class C 
{
    public:
        static C& Instance();
    private:
        C();

        mutable QMutex _mutex; 
};

c.cpp:

C& C::Instance() 
{
    static C instance;
    return instance; 
} 
C c = C::Instance();

然后我得到的错误(gcc 4.2)是

  

错误:'QMutex :: QMutex(const QMutex&)'在此上下文中是私有的

     首先需要

合成方法'C :: C(const C&)'//在C :: Instance()

如果我删除'mutable'关键字,这个错误会消失,但当然我无法制作锁定/解锁_mutex const的方法。编写我自己的副本ctor并没有改变任何东西。有谁知道如何解决这个问题?注意这看起来类似于this post,但这是客观的C,那里的代码太多,似乎与问题无关。

编辑:刚才意识到问题显然是QMutex的复制版本是私有的。但我不明白为什么'可变'应该在这里有所作为,即为什么它会诱导副本。

1 个答案:

答案 0 :(得分:3)

您正在尝试复制单件,但由于您已将复制构造函数声明为私有,因此失败。它与可变成员完全无关。