2012-01-10 5 views
0

나는 (그래, 나도 알아 - 그들은 일반적으로 나쁜 것) 싱글 톤 패턴을 사용하고 있다면 ... 내가 이렇게 같은 인스턴스 기능을 가지고 :함수 내에서 정적 인 저장소 클래스는 무엇이며 그 이유는 무엇입니까?

instance 어떤 스토리지 클래스
MySingleton* Instance() { 
    static MySingleton instance; 
    return &instance; 
} 

를?

나는 "데이비드 R. Butenhof에 의해 POSIX 스레드 프로그래밍"읽고 있어요, 그리고 내가 말한 텍스트 건너 온 :

당신은 아마 통근 또는 정적을 사용하여 상태 변수를 선언 할 수 있습니다 대부분의 시간 파일 범위의 저장소 클래스, 즉 함수 외부의 저장소 클래스 변수가 선언 된 파일 내에서만 사용되는 경우 다른 파일이나 정적 저장소 클래스에서 사용하는 경우 일반 (외부) 저장소 클래스가 있어야합니다.

정적은 함수 안에 있으므로 자동입니까? 또는 정적 키워드 때문에 다른 클래스입니까?

'인스턴스'변수를 파일에서 정적 및 전역 변수로 이동하면 다른 파일에 대한 참조를 여전히 제공 할 수 있습니까, 아니면 작동하지 않겠습니까?

답변

4

필자는 어떤 키워드를 사용하는지에 대한 조언이 있지만 저장 기간과 링크가 융합 된 것으로 생각합니다.

함수 범위 변수 instance에는 정적 저장 기간이 있습니다. static 키워드가 없으면 자동 저장 기간이 적용됩니다.

파일 범위가 인 개체는 항상 인 C++ 11에서 정적 저장 기간 (물론, 저장소 저장 기간)을 갖습니다. 파일 범위에서 static 키워드를 사용하면 개체 내부 연결, extern에 외부 연결을 부여하면 저장 기간에 영향을주지 않습니다.

static이 "저장소 클래스 지정자"이기 때문에 "정적 저장소 클래스"를 기술하는 것이 맞지만 파일 범위의 static의 의미가 함수의 의미와 다르기 때문에 전체 스토리는 아닙니다. 범위.

정적 저장 기간이있는 객체에 대한 참조를 전달하여 다른 번역 단위에서 코드를 작성할 수 있습니다. 파일 범위 나 기능 범위가 있는지 여부는 중요하지 않으며 링크가 무엇인지는 중요하지 않습니다. "다른 파일에서 사용하는 경우 정상적인 (외부) 저장소 클래스가 있어야합니다"라는 말은으로 다른 파일이 을 참조 할 경우 외부 연결이 필요하다는 것을 의미합니다. 내부 연결을 사용하는 전역 이름은 각 TU의 다른 객체. 엄밀히 말하면, 개체가 아니라 연계가있는 이름입니다.

+0

답변 해 주셔서 감사합니다. 무슨 일로 나를 혼란스럽게 만들었습니까?이 자료를 배우기에 좋은 자료를 알고 있습니까? 내 C++ 서적에서 (중요한 방식으로) 건너 뛴다는 것은 아닙니다. 배울만큼 충분하지 않은 이상한 참조입니다. –

+0

@ w00te : 표준. "저장 기간", "연결"및 "저장 클래스 지정자"에 대한 전체 절을 읽으십시오. 그런 다음 링키지 자체는 매우 간단하기는하지만 서로 다른 저장소 클래스 지정자를 사용하는 여러 선언에 대한 규칙이 혼란 스럽기 때문에 링키지 섹션을 다시 읽으십시오. 마지막으로 DLL과의 임포트/익스포트가 컴파일러에 의해 어떻게 다루어 지는지에 대한 구체적인 구현을 읽는 것이 가치가있을 것입니다. 왜냐하면 그것은 링키지와 같지 않지만 매우 밀접하게 연관되어 있기 때문입니다. –

+0

고마워, 나는 그것을 나의 독서 목록에 추가 할 것이다 - 그것이 태아의 위치에 나를 넣을지도 모르지만 그것은 소리가 난다. :) –

4

instancestatic 한정자로 정규화되었으므로 정적 저장소 클래스가 있습니다. 로컬 범위가있는 변수는 automatic입니다.
파일 범위에서 선언 된 정적 변수는 내부 연결을 가지며 다른 파일에서 사용할 수 없습니다.
파일에서 사용할 수있는 전역 변수를 선언하려면 변수 외부 연결을 제공하는 extern을 사용해야합니다.

+0

그래서, (싱글 예) 인스턴스가 파일에 걸쳐 사용할 수 있습니다,하지만 난 파일 범위를 선언하면 내가 파일을 통해 사용하지 수 있을까? –

+0

@ w00te : 아니요. 정적 내부 함수는 해당 함수로만 범위가 제한됩니다. 반면 파일의 정적 범위는 해당 파일로만 제한됩니다. –

+0

그래서,이 싱글 톤 메소드가 작동하지 않거나, 포인터가 메모리 위치로 리턴 되었기 때문에 괜찮습니까? –

1

일반적으로 프로젝트에서 단일 패턴이 사용되므로 해당 프로젝트에 단 하나의 인스턴스 만 사용됩니다. DB 연결 풀 생성기 또는 구성과 유사합니다. 싱글 톤은 다음과 같은 방식으로 사용됩니다. 항상 호출 될 인스턴스는 클래스에서 정적이고 private이어야하며 클래스의 생성자는 private이어야하며 getInstance 함수는 public이어야합니다. 의 아래 보자 :

/** 
* @author harzumanian 
* 
*/ 
public class LogManager { 

    private File file = null; 
    private static LogManager logger = null; 

    /** 
    * 
    */ 
    private LogManager() { 
     file = new File(Constants.PLUGIN_LOG); 
    } 

    public static LogManager getLogger() { 
     if (logger == null) { 
      logger = new LogManager(); 
     } 
     return logger; 
    } 
}