【发布时间】:2011-10-28 19:52:41
【问题描述】:
编辑:请参阅 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&)' //at C::Instance()
如果我删除 'mutable' 关键字,这个错误就会消失,但是我当然不能使用锁定/解锁 _mutex const 的方法。编写我自己的副本 ctor 不会改变任何东西。有谁知道如何解决这个问题?请注意,这看起来类似于 this post,但这是客观 C 语言,其中有太多代码似乎与问题无关。
编辑:刚刚意识到问题显然是 QMutex 的复制 ctor 是私有的。但我不明白为什么“可变”在这里应该有所作为,即为什么它会引发副本。
【问题讨论】:
-
C c = C::Instance();会复制实例吗?你确定这是你想做的吗? -
@GWW 哦,哈哈,你是对的! 脸红
-
所以问题归结为:
mutable如何影响编译器生成的复制构造函数的公共/私有性质? -
@Mark 好的,我仔细检查过,实际上我确实遇到了同样的错误,只是第一次没有看到。删除此问题。
标签: c++ static singleton mutable