문제

모두 기본 클래스에서 파생되는 여러 클래스가 있습니다. 이제 파생 클래스 중 일부는 플랫폼에 따라 컴파일되지 않습니다.기본 클래스의 개체를 반환할 수 있는 클래스가 있지만 이제 파생 클래스의 모든 이름이 하드 코딩되었습니다.

런타임 시 어떤 클래스가 컴파일되었는지 확인하여 링크를 제거하고 대신 동적으로 로드 가능한 라이브러리를 제공할 수 있는 방법이 있습니까?

도움이 되었습니까?

해결책

C++ 런타임 클래스 등록을 찾고 계십니까?나는 이것을 찾았다 링크 (지원).

그러면 아마도 원하는 결과가 나올 것입니다. 동적으로 로드되는 모듈과 동일한 방법을 사용하여 모듈을 등록할 수 있는지 여부에 대해서는 잘 모르겠습니다.

다른 팁

실제로 달성하려는 것이 무엇인지는 모르겠지만 팩토리에 대한 포인터와 함께 목록에 이름을 추가하는 각 파생 클래스의 구현 파일에 싱글톤 생성자를 넣을 수 있습니다.그러면 목록은 항상 최신 상태가 되며 클래스에서 컴파일된 모든 항목을 생성할 수 있습니다.

일반적으로 C++에서는 런타임 유형 정보에 의존하는 것이 좋지 않습니다.당신이 설명한 것은 공장 패턴처럼 보입니다.각 플랫폼에 대해 해당 플랫폼에 존재하는 클래스에 대해서만 알 수 있는 특수 팩토리 하위 클래스를 만드는 것을 고려할 수 있습니다.

이것은 "컴파일 시간 다형성" 또는 템플릿 정책 매개변수를 사용하는 장소처럼 들립니다.

Andrei Alexandrescu와 그의 최신 C++ 디자인을 참조하세요. 로키 책을 기반으로 구현.또한 참조하십시오 로키 Wikipedia의 페이지.

런타임에 클래스 정보를 얻기 위한 불쾌한 컴파일러 관련 트릭이 있습니다.저를 믿으십시오. 당신은 그 벌레 캔을 열고 싶지 않을 것입니다.

내가 보기에 이 작업을 수행하는 유일한 진지한 방법은 파생된 클래스 각각에 대해 조건부 컴파일을 사용하는 것입니다.#ifdef 블록 내에서 다음을 정의합니다. 새로운 컴파일되는 클래스 이름을 포함하는 상수입니다.그런 다음 이름은 여전히 ​​하드 코딩되어 있지만 모두 중앙 위치에 있습니다.

파생 클래스의 이름은 C++로 하드 코딩되어야 합니다.그것들을 사용하는 다른 방법은 없습니다.따라서 어떤 클래스가 컴파일되었는지 자동으로 감지할 수 있는 방법이 없을 뿐만 아니라 해당 정보가 존재하는 경우 이를 사용할 방법도 없습니다.

이름을 기반으로 런타임에 클래스를 지정할 수 있다면 다음과 같습니다.

std::string foo = "Derived1";기본 * 객체 = 새로운 "foo";// 또는 원하는 표기법 - C++에서는 작동하지 않습니다.

그러면 "Derived1"이 컴파일되었는지 여부를 알 수 있는 기능이 유용할 것입니다.다음과 같이 클래스를 직접 지정해야 하므로:

기본 * 개체 = 새 Derived1;// C++에서는 작동합니다.

모든 검사는 컴파일 타임에 수행됩니다.

모든 클래스에 자체 동적 라이브러리가 있는 경우 라이브러리가 있는지 확인하세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top