c++ - 具有可变成员的单例对象

标签 c++ static singleton mutable

编辑:参见 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/

相关文章:

c++ - 当对象被删除时,复制被删除对象的对象又如何呢?

reflection - 类方法的 noSuchMethod(又名静态方法)

java - Java中如何在其他静态方法中使用静态方法变量?

c++ - 对此(希望)100% 安全的双重检查锁定替代单例的任何评论

c++ - 没有父指针的AVL树如何实现插入?

c++ - 从 QML ListView 操作 QAbstractListModel 中的数据

c++ - 您查找段错误原因的方法是什么?

C++ 静态变量和 Unresolved external 错误

singleton - EJB-@Singleton 管理查询结果

java - java中的工厂方法模式