문제
모두 기본 클래스에서 파생되는 여러 클래스가 있습니다. 이제 파생 클래스 중 일부는 플랫폼에 따라 컴파일되지 않습니다.기본 클래스의 개체를 반환할 수 있는 클래스가 있지만 이제 파생 클래스의 모든 이름이 하드 코딩되었습니다.
런타임 시 어떤 클래스가 컴파일되었는지 확인하여 링크를 제거하고 대신 동적으로 로드 가능한 라이브러리를 제공할 수 있는 방법이 있습니까?
다른 팁
실제로 달성하려는 것이 무엇인지는 모르겠지만 팩토리에 대한 포인터와 함께 목록에 이름을 추가하는 각 파생 클래스의 구현 파일에 싱글톤 생성자를 넣을 수 있습니다.그러면 목록은 항상 최신 상태가 되며 클래스에서 컴파일된 모든 항목을 생성할 수 있습니다.
일반적으로 C++에서는 런타임 유형 정보에 의존하는 것이 좋지 않습니다.당신이 설명한 것은 공장 패턴처럼 보입니다.각 플랫폼에 대해 해당 플랫폼에 존재하는 클래스에 대해서만 알 수 있는 특수 팩토리 하위 클래스를 만드는 것을 고려할 수 있습니다.
런타임에 클래스 정보를 얻기 위한 불쾌한 컴파일러 관련 트릭이 있습니다.저를 믿으십시오. 당신은 그 벌레 캔을 열고 싶지 않을 것입니다.
내가 보기에 이 작업을 수행하는 유일한 진지한 방법은 파생된 클래스 각각에 대해 조건부 컴파일을 사용하는 것입니다.#ifdef 블록 내에서 다음을 정의합니다. 새로운 컴파일되는 클래스 이름을 포함하는 상수입니다.그런 다음 이름은 여전히 하드 코딩되어 있지만 모두 중앙 위치에 있습니다.
파생 클래스의 이름은 C++로 하드 코딩되어야 합니다.그것들을 사용하는 다른 방법은 없습니다.따라서 어떤 클래스가 컴파일되었는지 자동으로 감지할 수 있는 방법이 없을 뿐만 아니라 해당 정보가 존재하는 경우 이를 사용할 방법도 없습니다.
이름을 기반으로 런타임에 클래스를 지정할 수 있다면 다음과 같습니다.
std::string foo = "Derived1";기본 * 객체 = 새로운 "foo";// 또는 원하는 표기법 - C++에서는 작동하지 않습니다.
그러면 "Derived1"이 컴파일되었는지 여부를 알 수 있는 기능이 유용할 것입니다.다음과 같이 클래스를 직접 지정해야 하므로:
기본 * 개체 = 새 Derived1;// C++에서는 작동합니다.
모든 검사는 컴파일 타임에 수행됩니다.
모든 클래스에 자체 동적 라이브러리가 있는 경우 라이브러리가 있는지 확인하세요.