2011-10-28 2 views
0

편집 : GWW의 대답을 참조하십시오. 문제는 단순히 C :: Instance()로 불법 복사를하는 것이 었습니다. 그리고 내가 틀렸어, 오류가 mutable에 의존하지 않습니다.변경 가능한 멤버가있는 싱글 톤 객체

정적 메서드가 변경 가능한 메서드와 호환되지 않습니까?

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를 잠 그거나 잠금 해제하는 메소드를 만들 수는 없습니다. 내 자신의 복사본을 작성해도 아무런 변화가 없습니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까? NB는 this post과 유사하지만 객관적인 C 코드이며 거기에 너무 많은 코드가있어서 질문과 관련이없는 것으로 보입니다.

편집 : QMutex의 복사본은 개인적인 문제라는 것을 분명히 깨달았습니다. 하지만 '변경 가능'이 왜 달라 지어야하는지, 즉 복사를 유도하는 이유를 이해할 수 없습니다.

+0

'C c = C :: Instance();'인스턴스를 복사합니까? 네가 그 일을하고 싶다고 확신하니? – GWW

+0

@GWW 오, 너 괜찮아! * blush * –

+0

그래서 문제는 '변경 가능'이 컴파일러에서 생성 된 복사 생성자의 공개/비공개 특성에 어떤 영향을 줍니까? –

답변

3

당신이 당신의 싱글 톤을 복사하려하고 복사 생성자를 private으로 선언했기 때문에 실패합니다. 변하기 쉬운 일원과 절대적으로 관련이 없습니다.

+2

'C & c = C :: Instance();'는 아마 그것을 고칠 것입니다 – GWW