具有可变成员的单例对象

Singleton objects with mutable members

本文关键字:单例 对象 成员      更新时间:2023-10-16

编辑:看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)是

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

合成方法'C::C(const C&)'首先需要在这里//在C::Instance()

如果我删除'可变'关键字,这个错误就会消失,但是当然,我不能使锁/解锁_mutex的方法为const。写我自己的拷贝器改变不了什么。有人知道怎么解吗?注:这看起来和这篇文章很相似,但那是objective-C,里面有太多的代码似乎与问题无关。

编辑:刚刚意识到的问题,显然,是QMutex的复制器是私有的。但我不明白为什么"可变"在这里应该有所不同,即为什么它会引起复制。

你试图复制你的单例,但它失败了,因为你已经声明了一个私有的复制构造函数。它与可变成员完全没有关系。