1

이 항목에 대한 답변이 많지만 여전히 문제가 있습니다.정적 속성을 호출 할 때 "확인되지 않은 외부"가 표시되는 이유는 무엇입니까? Visual C++

모두처럼, 싱글 톤 패턴을 구현하고 싶습니다. 나는이 시도했다 : 나는 의 getInstance() 정적 방법에서 * self_inst의 * 호출 할 때

class Factory 
{ 

private: 
    Factory(void); 
    static Factory* self_inst; 

public: 

    ~Factory(void); 

    IPortIO* getStrategy(int portType); 
    static Factory *getInstance() 
    {   
     if(self_inst == NULL) 
      self_inst = new Factory(); 
     return self_inst;  
    } 

}; 

문제가 온다. 많은 사람들은 정적 변수를 사용할 때 선언 할뿐만 아니라 다른 곳에서 정의해야한다고 말했습니다. 값으로, 클래스 외부

Factory* Factory::self_inst; 

: 2 : 클래스 밖에서

1 : 글쎄, 난 아주 장소에 정의하려고 문제를했습니다

Factory* Factory::self_inst=NULL; 

3 정적 내부 방법

static Factory *getInstance() 
{  
    Factory* Factory::self_inst;  
    if(self_inst == NULL) 
     self_inst = new Factory(); 
    return self_inst;  
} 

(4) 및 내부 고정 방법이지만 값 :

static Factory *getInstance() 
{  
    Factory* Factory::self_inst=NULL;  
    if(self_inst == NULL) 
     self_inst = new Factory(); 
    return self_inst;  
} 

아무 것도 작동하지 않습니다! 마지막으로 클래스에 정적 속성을 만들지 않기로 결정했지만 정적 메서드 내부에 정적 변수를 만들지 않기로 결정했습니다. 이 방법은 똑같지 만 좋은 프로그래밍 방법은 아닙니다. 두 가지 정적 메서드를 사용하여 같은 변수에 액세스해야한다면 어떻게해야합니까? 그건 내 사건이 아니지만, 좋은 질문이고, 누군가가 그 일을 할 수 있는지 잘 아는 지 알고 싶습니다.

+0

팩토리 기능을 구현하는 .cpp에서이를 정의 할 수 있어야합니다. .cpp 파일에'Factory * Factory :: self_inst = NULL;'을 넣을 때 에러 메시지가 나옵니까? – JBL

+0

코드의 예는 [compileable] (http://coliru.stacked-crooked.com/view?id=7cef44ef9edf8b212f3ef17fcb4fba27-7063104e283ed82d51a6fde7370c6e59)입니다. 정적 멤버는 CPP 파일 –

+0

에서 초기화되어야합니다. 또한 C++ 11을 사용하는 경우 NULL 매크로 대신에'null_ptr'을 사용해야합니다. – JBL

답변

1

숫자 2가 맞습니다 (기본 초기화가 NULL이기 때문에 실제로 숫자 1입니다.) 헤더에없는 것을 cpp 파일에 넣어야합니다.

여전히 작동하지 않는 경우 오류 메시지를 게시하십시오.

+0

감사합니다. 것은 john과 JBL이 말했듯이 CPP (헤더가 아님) 파일의 정적 변수를 초기화하는 것이 었습니다. 이제 제대로 작동합니다. – Nachokhan