2010-11-28 6 views
5

가능한 중복 :
C++ singleton vs completely static objectC++ 싱글 대 정적 메소드

안녕,

는 왜 정적 클래스 메소드를 통해 싱글을 선호한다.

MoneyPrinter::addJob(PrinterJob &job); 
or 
    MoneyPrinter::getInstance().addJob(PrinterJob &job); 

스타일 만 문제가 되나요? 무엇을 사용 하시나요? 왜?

ps. sigleton은 기본적으로 threadsafe (초기화)가 아닙니다.

+0

누가 선호해야한다고 말합니까? –

+0

나는 그곳에 결코 대답하지 않았다는 점을 제외하고는 사본에 동의 할 것이다. –

+0

MoneyPrinter :: GetInstance(). addJob (PrinterJob &job); – T33C

답변

2

싱글 톤은이 클래스가 인스턴스화 될 때 당신이 제어 할 수 및 DeadMG가 지적으로 경우 당신은 그것을 인스턴스화합니다. 정적 클래스는 덜 제어 가능하며 main 호출 전에 인스턴스화됩니다.

클래스가 인스턴스화되는 순서는 싱글 톤이 main이 호출되기 전에 사용할 수없는 다른 클래스 나 리소스에 의존 할 때 때로는 중요 할 수 있습니다.

언급 한 것처럼 여러 스레드에서 하나의 싱글 톤을 호출하려면 스레드 안전 싱글 톤을 사용해야합니다. Scott Meyer (Effective C++)는 스레드 세이프하지 않습니다.

+0

정적 "Singleton"구현 파일 내에서 항상 비밀 데이터를 조작 할 수 있습니다. 실제로 완전한 클래스 구조를 사용할 수 있고 다양한 싱글 톤 중 하나와이 정적 인 것의 차이점은 순전히 구문 적입니다. –

+0

@ 노아 - 차이점은 의미 론적이며 giowck은 두 가지 접근법을 모두 고려하고 이해해야하기 때문에 좋은 질문을 던졌습니다. – T33C

3

싱글 톤의 일반적인 규칙은 묻지 않으면 사용하지 않는 것입니다. 이것은 전역 적으로 변경할 수있는 모든 상태에 해당됩니다.

+0

이 규칙을 좋아합니다. 너무 짧고 사실이지만 중요합니다. – delnan

+10

-1 때문에 –

5

이유 I 정적 클래스 메소드

싱글 톤 내부 상태를 가질 수 통해 싱글를 선호한다 (검색 예에서는, 추가 작업리스트), 즉 단일 클래스의 멤버 데이터.

무엇을 사용합니까? 왜?

상태가없는 경우 가장 간단한 정적 방법입니다.

그렇지 않으면 정적으로 초기화되는 (또는 저스트 인 타임 또는 런타임이 아닌 초기화되는) 싱글 톤이 바람직합니다.

+6

정적 메서드가있는 상태가있을 수 있습니다. 정적 변수 일뿐입니다. –

+1

상태가없는 경우 왜 정적 메서드가없는 클래스를 인스턴스화하지 않는 * 언어로 만듭니다. 클래스 페티쉬 *가 꼭 필요한 것은 아닙니다.그냥 적절한 네임 스페이스에서 여러 기능을 사용하십시오. – delnan

+0

@Billy ONeal - 인스턴스화 할 정적 변수가있는 경우 싱글 톤과 유사하므로 싱글 톤 클래스 내에서 함께 그룹화하는 것이 좋습니다 – ChrisW

2

정적 멤버 함수를 사용하는 경우 사용되는 구문 때문에 단순히 Singleton-Ness를 리팩터링하는 것이 어려울 수 있습니다. 이유가 하나 있습니다.