2013-05-06 1 views
3

C++에서 default 소멸자을 'private'으로 만드는 싱글 톤 클래스를 선언하는 패턴을 테스트했지만 패턴은 멤버 호출을 통해이 소멸자를 사용하지 않습니다.왜 통계학을 정리하는 메커니즘이 개인 회원을 호출 할 수있는 액세스 권한을 얻는가?

나는이 코드를 gnu g ++ 컴파일러를 사용하여 Ubuntu QQ에서 테스트했습니다. 소멸자는 '개인용'으로 지정되었지만 프로그램 종료시 호출되었습니다.

이 소멸자는 비공개로 지정 되었기 때문에 누가 호출 했습니까?

참고 : 나는 델파이/오브젝트 파스칼 세계에서 왔고, ObjectPascal에서 지원하는 정적 클래스 선언은 없습니다. - 싱글 톤을 생성하는 몇 가지 방법이 있지만. 제 경험상 '개인적'('엄격한 사생활'...)은 개인입니다. C++에서는 꽤 그렇게 생각하지 않습니다.

설명? 소멸자 개인 만들기 (OP 편집 후 편집)

+0

[가능한 정적 개체의 개인 소멸자는 무엇입니까?] (http://stackoverflow.com/questions/11524131/how-are-the-private-destructors-of-static-objects-called) –

답변

1

명시 적으로 호출되는 것을 방지 할 수 있습니다. 소멸자가 공공 인 경우

이 법적 될 것이다 : 정적 스토리지 객체의

MyClass.getInstance().~MyClass(); 

소멸자 출구를 메인에서 반환() 또는 호출의 결과로 불린다().

+0

@Mikey - 새로운 질문이 위에 답변되었습니다. –

+0

새 질문 제목보기 및 수정 ... :-) 제 질문을 분명히하지 않고있는 것 같아요. – Vector

+0

공개해야하는지 질문했습니다. 두 번째 질문은 http : // stackoverflow에 의해 처리됩니다.com/questions/11524131/how-are-the-private-destructors-of-static-objects- 호출됩니다. –

4

개체는 일반적으로 과 같은 개체 함수 static에 의해 인스턴스화 된 다음 개체에 대한 참조를 제공합니다. 멤버 함수이기 때문에 생성자에 액세스 할 수 있습니다.

고전적인 예 :

class S 
{ 
    public: 
     // This is a member function so can access the constructor of S 
     static S& getInstance() 
     { 
      static S instance; 
      return instance; 
     } 
    private: 
     S() {}; 
     S(S const&); 
     void operator=(S const&); 
}; 
+0

명백한 내 질문에 대한 바보 같은 질문 - 편집을 참조하십시오. – Vector

1

일반적인 싱글 톤 클래스는 단일 개체에 대한 포인터를 반환하는 정적 멤버 함수를 가지고있다. 예를 들어 instance() 정적 멤버 함수 인

Singleton *Singleton::instance(); 

. 정적 멤버 함수는 private 생성자를 호출 할 수 있습니다.

+0

분명히 내 부분에 대한 바보 같은 질문 - 생성자를 참조하십시오. – Vector

+0

내가 잘못 본 것이 아니라면 프로그램이 종료 될 때 정적 객체의 소멸자가 호출됩니다. –

+0

그래서 나는 생각할 것입니다 -하지만 그것을 부르는 것은 무엇입니까? 소멸자가 private 인 경우 외부에서 호출 할 수 없습니다. 그리고 기본 소멸자가 아무렇게나 호출되면, 그것을 private으로 선언하는 것은 무엇입니까? 소멸자에 정리 코드가 있다면 어떻게 될까요? 나는이 디자인으로 무언가가 옳지 않다고 생각한다. – Vector

1

외부의 모든 코드로 해당 개체를 구성하거나 파괴하지 않으려 고하기 때문에 비공개입니다. 싱글 톤에는 일반적으로 factory 메소드를 통해 초기화되고 삭제되는 정적 인스턴스가 있습니다.

tempalte <class T> 
class Singleton 
{ 
public: 
    static T* GetInstance() 
    { 
     if(!m_sInstance) 
     { 
      m_sInstance = new T(); 
     } 

     return m_sInstance; 
    } 

    static void DestroyInstance() 
    { 
     delete m_sInstance; 
     m_sInstance = 0; 
    } 
private: 
    static T* m_sInstance;  
}; 

class Foo : public Singleton<Foo> 
{ 
friend class Singleton<Foo>; 
private: 
    Foo(); 
    ~Foo(); 
}; 

그래서 당신은 액세스하고 단일 개체를 삭제하는 Foo::GetInstance()Foo::DestroyInstance()를 호출 할 수 있습니다.