2015-02-03 7 views
2

이전에 한 객체의 인스턴스를 더 이상 정의 할 수 없다는 내용을 읽었습니다. 하지만 그 기사를 다시 찾을 수는 없습니다. 다른 사람이 클래스의 다른 객체를 정의하지 못하도록하는 방법을 말해 줄 수 있습니까? CLog?클래스의 인스턴스를 두 개 이상 정의 할 수 없음

class CLog 
{ 
........ 


} log; 
+7

Google * 싱글 톤 패턴 * 그리고 왜 [사용하지 말아야하는지]에 대해 읽어보십시오. (http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you -never-had-since-1995 /). – Praetorian

+0

@Praetorian 나는 log2와 log3을 정의하는 것을 막고 싶다 .... 내 프로그램이 디버그 모드에 있더라도이를 피해야한다고 생각합니까? – barej

+0

디버그 모드는 정의와 아무 관련이 없습니다. 예, Singleton이 대답입니다.) –

답변

0

싱글 톤에 대한 또 다른 해결책은 Service Locator 패턴을 사용하는 것입니다.

좋은 설명과 사용 방법은 http://gameprogrammingpatterns.com/service-locator.html에 설명되어 있습니다.

싱글 톤과 마찬가지로이 패턴은 아껴서 사용해야하지만 로깅 시스템은 좋은 사용 사례가 될 수 있으며 그 외에는 새로운 디자인 패턴을 가르치지 않습니다.

-1

생성자를 비공개로 만듭니다. 클래스의 인스턴스를 반환하는 public 메서드를 하나 정의하십시오.

class sample{ 
private: 
    sample(){}; 
    static *sample instance; 
public: 
static *sample getInstance(){ 
    if (instance != null) 
     instance = new sample(); 
    return instance; 
} 

의 getInstance() 메소드는 그것이 기존 그렇지 않으면 당신이 클래스의 단일 인스턴스를 생성하는 클래스를 만들 수있는이 방법 one.In 새로운 생성 retuns 존재하는 경우 인스턴스가 존재 여부를 확인 작성하기 전에 클래스의 인스턴스를 생성 . 생성자는 private이므로 아무도 생성자를 사용하여 객체를 만들 수 없습니다.

+0

이것은 스레드로부터 안전하지 않습니다. 인스턴스 자체를 로컬 정적으로 만듭니다. – rubenvb

+0

물론 본질적으로 클래스는 스레드로부터 안전하지 않으며 *는 잘못된 placev에 있으며 복사 구성을 비활성화하지 않았습니다 – CashCow

+0

@rubenv는 Meyers 싱글 톤입니다. C++ 11 표준은 구조체가 실제로 스레드 안전하지만 파괴 순서가 결정되지 않았다고 선언합니다. call_once도 좋은 방법입니다. – CashCow

관련 문제