[C++] 자체 등록, 추상 공장 연결


Answers

Question

저는 여기에 설명 된 것을 기반으로 자체 등록, 추상 팩토리를 테스트하고 테스트 해 왔습니다 :

https://.com/a/582456

모든 테스트 케이스에서는 매력처럼 작동하며 원하는 기능과 재사용을 제공합니다.

cmake를 사용하여이 프로젝트를 내 프로젝트에 연결하는 것은 꽤 까다 롭습니다 (그러나 ar 문제가 더 많을 것으로 생각됩니다).

나는 동일한 base.hpp, derivedb.hpp / cpp 및 이와 동등한 deriveda.hpp / cpp를 링크 된 예제에 있습니다. main에서 나는 단순히 factory를 인스턴스화하고 createInstance ()를 두 번, 각각 "DerivedA"와 "DerivedB"로 호출한다.

행에 의해 생성 된 실행 파일 :

g++ -o testFactory main.cpp derivedb.o deriveda.o

예상대로 작동합니다. 내 파생 클래스를 라이브러리로 이동 (cmake를 사용하여,하지만 ar 혼자뿐만 아니라 이것을 테스트) 및 다음 연결 실패 :

ar cr libbase.a deriveda.o derivedb.o
g++ -o testFactory libbase.a main.cpp

오직 (derivedA.cpp에서) 첫 번째 정적 인스턴스화를 호출하고 결코 두 번째 정적 인스턴스화를 호출하지 않습니다.

// deriveda.cpp (if listed first in the "ar" line, this gets called)
DerivedRegister<DerivedA> DerivedA::reg("DerivedA");

// derivedb.cpp (if listed second in the "ar" line, this does not get called)
DerivedRegister<DerivedB> DerivedB::reg("DerivedB");

ar 라인에서 두 변수를 서로 바꾸면 deriva.cpp 인스턴스가 아닌 derivedb.cpp 정적 인스턴스 만 호출됩니다.

어떻게 든 C ++에서 정적 변수를 사용하면 좋지 않은 ar 또는 정적 라이브러리를 사용하여 누락 되었습니까?