2011-10-28 3 views
0

EDIT: см. Ответ GWW, проблема заключалась в том, чтобы просто сделать незаконную копию с помощью C :: Instance(). И я ошибся, ошибка не зависит от mutable.Объекты Singleton с изменяемыми членами

Статические методы несовместимы с изменяемыми методами? Вот упрощенная версия моего кода:

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 ничего не меняет. Кто-нибудь знает, как это решить? NB это похоже на this post, но это объективный C, и там было слишком много кода, который не казался релевантным этому вопросу.

EDIT: Только что понял, что проблема заключается в том, что копия QMutex ctor является частной. Но я не понимаю, почему «изменчивый» должен иметь значение здесь, то есть почему он вызывает копию.

+0

'C c = C :: Instance();' скопирует экземпляр? Вы уверены, что это то, что вы хотите сделать? – GWW

+0

@GWW О, ты прав! * blush * –

+0

Итак, вопрос сводится к следующему: как 'mutable' влияет на публичный/частный характер созданного компилятором конструктора копий? –

ответ

3

Вы пытаетесь скопировать свой синглтон, и он терпит неудачу, потому что вы объявили конструктор копирования закрытым. Это абсолютно не имеет отношения к изменяемым членам.

+2

'C & c = C :: Instance();' вероятно, исправит это – GWW