2009-12-10 2 views
2

싱글 톤이 필요한 클래스가 있습니다. 이 클래스는 동일한 애플리케이션에서 여러 DLL에 사용되는 .LIB로 컴파일C++ : 정적 멤버가 중복 되었습니까?

class MySinglton 
{ 
public: 
    static MySinglton& instance() { ... } 
private: 
    static MySinglton* m_inst; 
}; 

: 그것은 고정 부재 포인터를 사용하여 구현. 문제는 각 dll이 다른 m_inst을 보는 것입니다. 그것은 컴파일되고 분리되어 링크되기 때문입니다.

이 문제를 해결하는 간단한 방법은 무엇입니까?

.lib를 자체 dll로 구분하는 것은 옵션이 아닙니다. .lib이어야합니다.

+0

.lib로 컴파일하지 마십시오. 그것을 dll로 컴파일하십시오. 그럼 다른 모든 DLL은 같은 인스턴스를 사용합니다. –

+0

정적이 아니어야합니다. – rerun

+0

예, 고침, 고정 – shoosh

답변

0

해결 방법은 응용 프로그램에 인스턴스화를 전송할 수 있으며 초기화 중에 DLL이이를 참조하게됩니다. 원하는만큼 우아하지 않을 수도 있지만 그렇게 할 수 있습니다.

귀하의 질문에 실제적인 문제점이 있는지 알아야합니다. 답변이 예상 한 형태가 아닐 수도 있습니다. ;)

+0

... 더 이상이 사실을 얻지 못합니다. 두 개의 dll, 한 개의 lib, 두 개의 인스턴스. – shoosh

+1

흠 ... "산이 모하마드에 가지 않으면 모하마드가 그 산에 가자." ;) 죄송 해요. –

0

이 단순한 것으로 생각하는지 모르겠지만 힙에 "마스터 인스턴스"를 할당 한 다음 모든 MySingleton 인스턴스가 "마스터 인스턴스"를 참조해야합니다.

+0

예. 모든 인스턴스가이 마스터 인스턴스에 대해 어떻게 알 수 있습니까? – shoosh

+0

Denes Tarjan이 지적했듯이 "마스터 인스턴스"는 초기화 중에 응용 프로그램에서 모든 인스턴스에 전달할 수 있습니다. –

0

C++에는 사용자가 원하는 것처럼 변수를 공유하는 메커니즘이 없습니다. 유일한 해결책은 포인터 또는 참조를 사용하여 단일 인스턴스를 함수 매개 변수로 전달하는 것입니다.

-1

확실하지 그것을 할 수있는 가장 좋은 방법은 ...하지만 나는 그런 식으로 그것을 할 수 있습니다 경우 :
는 외부 메소드를 추가하는 DLL 자체에 싱글을 빌드 :
를 - 그것을
를 초기화하기 위해서 - 그것을 검색합니다.

+0

".lib을 자체 dll로 구분하는 옵션이 아니며 .lib이어야합니다." – shoosh

+0

DLL의 각 인스턴스는 변수의 자체 복사본을 가져옵니다.이 변수는 자신이 wahts 인 것처럼 보이지 않습니다. –

+0

사실, 당신은 DLL을 통해 데이터를 공유 할 수 있습니다 : http://msdn.microsoft.com/en-us/library/h90dkhs0(VS.80).aspx – Tryum

1

문제를 해결하는 한 가지 방법은 공유 메모리를 만들고 공유 메모리에 개체를 만드는 것입니다. 두 모듈은 여전히 ​​포인터의 사본을 두 개 가지고 있지만 동일한 위치, 즉 객체의 동일한 인스턴스를 가리 킵니다.

+0

-1, 질문을 다시 읽으십시오.dll은 동일한 주소 공간에 매핑됩니다. – avakar

+0

@avakar, 어떻게 중요합니까? 명명 된 공유 메모리를 사용하는 것은 같은 프로그램에서도 단순한 정류 방법입니다. – leiz

+0

나쁘다, 나는 당신의 요지를보고 아래 표를 제거했다. 그래서 SO가 투표 변경을 허용 할 수 있도록 사소한 편집을해야했습니다. – avakar

0

os, MapViewOfFile 또는 shmem에서 제공하는 공유 메모리 메커니즘을 사용합니다. 이는 다음과 같을 수 있습니다 :

class MySinglton 
{ 
    public: 
     static MySinglton& instance() { 
      static MySinglton* m_inst = get_shared(); 
      return *m_inst; 
     } 
    private: 
     static MySinglton * get_shared() 
     { 
      //1. Try to open shared memory, handle = OpenFileMapping. 
      //2. If successful, return MapViewOfFile(handle). 
      //3. Else, allocate enough space using CreateFileMapping, sizeof(MySingleton). 
      //4. Initialise MapViewOfFile(handle), return MapViewOfFile(handle). 
     } 

     void Initialise() 
     { 
      // Stuff you would normally do in operator new here. 
     } 

}; 
-1

문제에 대한 간단한 해결책은 없습니다. 질문 : 해결 방법이 없다면 무엇을 할 것입니까? 프로젝트를 포기 하시겠습니까? 또는 '.lib이어야합니다'제약 조건이 제거되도록 구조를 다시 변경 하시겠습니까? 이 문제가 상용 프로젝트와 관련된 것이라면 프로젝트 관리자, 이해 관계자 등에게 무엇을 말할 것입니까?

+0

나는 공유 메모리를 사용하여 모든 인스턴스가 동일한 포인터를 갖도록 지시 할 것이라고 말하고 싶습니다 ... 이것은 내가 바라는만큼 간단한 해결책이 아닙니다. 태도는 어때? – shoosh

+0

문제의 상황에 대한 전문적인 호기심, 그것이 어떻게 생겨나 고 what-if 질문을하는지. 나는 다른 C++ 개발자들이이 질문들과 다른 질문들을 마음 속에 묻고 있다고 확신한다. 당신이 불쾌감을 느끼면 사과드립니다. 아무도 의도하지 않았다. – Sam