2011-10-28 2 views
0

EDIT: Voir la réponse de GWW, le problème était simplement de faire une copie illicite avec C :: Instance(). Et j'avais tort, l'erreur ne dépend pas de mutable.Objets Singleton avec des membres mutables

Les méthodes statiques sont-elles incompatibles avec les méthodes mutables? Voici une version simplifiée de mon code:

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(); 

l'erreur que je reçois (gcc 4.2) est

error: 'QMutex::QMutex(const QMutex&)' is private within this context

synthesized method 'C::C(const C&)' first required here //at C::Instance()

Si je supprime le « mutable » mot-clé cette erreur disparaît, mais de Bien sûr, je ne peux pas faire les méthodes qui verrouiller/déverrouiller _mutex const. Ecrire ma propre copie ctor ne change rien. Quelqu'un sait comment résoudre cela? NB ceci ressemble à this post mais c'est l'objectif-C et il y avait juste trop de code là-dedans qui ne semblait pas pertinent à la question.

EDIT: Je viens de réaliser que le problème, évidemment, est que le copieur de QMutex est privé. Mais je ne comprends pas pourquoi «mutable» devrait faire une différence ici, c'est-à-dire pourquoi il induit une copie.

+0

'C c = C :: Instance();' va copier l'instance? Êtes-vous sûr que c'est ce que vous voulez faire? – GWW

+0

@GWW Oh LOL vous avez raison! * blush * –

+0

Donc la question se résume à: comment 'mutable' affecte la nature publique/privée du constructeur de copie généré par le compilateur? –

Répondre

3

Vous essayez de copier votre singleton et cela échoue parce que vous avez déclaré un constructeur de copie privé. Cela n'a absolument rien à voir avec les membres mutables.

+2

'C & c = C :: Instance();' corrigera probablement cela – GWW

Questions connexes