2014-12-11 3 views
3

나는이 질문을 다시 쓰고 있는데, 나는 이것을 처음 질문 할 때 이해하지 못했고 그 질문은 정말로 난잡 해졌다.Singleton instanced two times

저는 싱글 톤 패턴 클래스 (Meyers Singleton)를 라이브러리에 가지고 있습니다. 내 Main-Application에서 getInstance()를 호출하고 해당 라이브러리의 .cpp 내에서 두 개의 다른 주소를 얻습니다. 내가 LibraryInterface 내에서 getInstance()를 호출 할 때 같은 주소를 사용한다. Headerfile에서의 getInstance를 호출 할 때

MAIN.CPP

#include <GameEngine.h> 
#include <iostream> 

main() { 

    GameEngine& engine = GameEngine::getInstance(); 
    std::cout << &engine; // gives me address A 

    engine.doSomething(); 

} 

지금 그것을 잘 작동합니다 :

내부 라이브러리 GameEngine.h

class GameEngine { 

public: 
    static jglEngine& getInstance() // Singleton is accessed via getInstance() 
    { 
     static jglEngine instance; // lazy singleton, instantiated on first use 
     return instance; 
    } 

    void doSomething() { 
     GameEngine& engine = GameEngine::getInstance(); 
     std::cout << &engine; // gives me also address A 

    } 
private: 
    GameEngine() {}; 

    GameEngine(GameEngine const&); // prevent copies 
    void operator=(GameEngine const&); // prevent assignments 
} 

을하지만 난 기능을 넣어하지 않는 경우 헤더 안쪽에 정의가 있지만 소스 파일 안에는 다른 주소가 있습니다 :

내부 라이브러리 GameEngine.cpp

#include "GameEngine.h" 

void GameEngine::doSomething() { 

     GameEngine& engine = GameEngine::getInstance(); 
     std::cout << &engine; // gives me address B 

} 

발견 솔루션 : D

나는 그것이 작동 만든 정적 라이브러리에 동적 라이브러리를 변경했습니다.

+0

정적 멤버가 다른 스레드에서 초기화 된 경우 한 번에 문제가 발생할 수 있습니다 (대부분의 컴파일러 사용시). 이것이 아직도 사실인지 확실하지 않습니다. –

+1

하지만 여기서 다른 스레드를 사용하지 않습니까? – joshflosh

+0

코코아에 익숙하지 않기 때문에 잘 모르겠습니다. 그래도 시험 할만한 가치가있는 것. –

답변

0

모든 DLL이 실제로 진짜 문제 중 하나 (그러나 당신의 관점에 따라 장점이 가능 하나)

이 등을 극복 트릭이 있습니다 DLL을 사용하고, 정적 데이터의 자체 인스턴스를 가져옵니다 스레드 로케일 저장소를 사용하지만, 종종 DLL이 수작업으로 전달되어 단일 응용 프로그램에서 싱글 톤을 생성 한 다음이를 일종의 컨텍스트 개체로 전달해야합니다.