【问题标题】:Singleton objects with mutable members具有可变成员的单例对象
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • C & c = C::Instance(); 可能会解决这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多