2011-10-28 25 views
0

编辑:请参阅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()

如果我删除了“可变”关键字这个错误消失,但随后的当然,我不能使锁定/解锁_mutex const的方法。写我自己的副本ctor不会改变任何东西。任何人都知道如何解决此问题?注意,这看起来与this post类似,但这是Objective-C,那里的代码太多,似乎与该问题没有关系。

编辑:刚刚意识到这个问题,很明显,是QMutex的拷贝构造函数是私有的。但我不明白为什么'可变'应该在这里有所作为,也就是为什么它会产生副本。

+0

'C c = C :: Instance();'会复制实例吗?你确定这就是你想要做的? – GWW

+0

@GWW哦,大声笑你说得对! * blush * –

+0

所以问题归结为:mutable是如何影响编译器生成的拷贝构造函数的公有/私有性质的? –

回答

3

你要复制你的单身因为你已经声明一个拷贝构造函数私人失败。它与可变成员完全无关。

+2

'C&c = C :: Instance();''可能会修复 – GWW