编辑:参见 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&)' is private within this context
synthesized method 'C::C(const C&)' first required here //at C::Instance()
如果我删除 'mutable' 关键字,这个错误就会消失,但是当然我不能使锁定/解锁 _mutex 常量的方法。编写我自己的复制构造函数不会改变任何东西。任何人都知道如何解决这个问题?注意这看起来类似于 this post但那是 Objective-C,里面有太多似乎与问题无关的代码。
编辑:刚刚意识到问题显然是 QMutex 的复制构造函数是私有(private)的。但我不明白为什么“可变”在这里会有所不同,即为什么它会产生一个拷贝。
最佳答案
你正试图复制你的单例,但它失败了,因为你已经声明了一个私有(private)的复制构造函数。它与可变成员完全无关。
关于c++ - 具有可变成员的单例对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7934146/