Одиночные объекты с изменяемыми элементами - PullRequest
0 голосов
/ 28 октября 2011

РЕДАКТИРОВАТЬ: см. Ответ 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 &)' сначала требуется здесь // в C :: Instance ()

Если я удалю ключевое слово 'mutable', эта ошибка исчезнет, ​​но, конечно, я не смогу сделать методы, которые блокируют / разблокируют _mutex const. Написание собственной копии ctor ничего не меняет. Кто-нибудь знает, как это решить? Примечание: это похоже на этот пост , но это цель-C, и там было слишком много кода, который, казалось, не относился к вопросу.

РЕДАКТИРОВАТЬ: Только что понял, что проблема, очевидно, в том, что копирующий ctor QMutex является частным. Но я не понимаю, почему «изменчивый» должен иметь значение здесь, то есть, почему он вызывает копию.

1 Ответ

3 голосов
/ 28 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...