소개
객체 지향 프로그래밍에서는 인스턴스화하는 것이 일반적인 관행입니다. 특정 클래스의 객체. 그러나 특정 시나리오에서는 문자열로 저장된 클래스 이름을 기반으로 개체를 동적으로 생성하는 것이 유리할 수 있습니다. 이는 향상된 유연성과 코드 유지 관리성을 제공할 수 있습니다. 이 기사에서는 C에서 이러한 동적 객체 생성을 달성할 수 있는 가능성을 탐구합니다.
문자열-유형 변환을 사용한 동적 객체 인스턴스화
안타깝게도 C는 기본적으로 클래스 이름을 보유한 문자열을 실제 유형 정보로 변환하는 직접적인 메커니즘입니다. 이는 명시적인 코드 변경 없이는 정적으로 정의된 클래스를 동적으로 인스턴스화할 수 없음을 의미합니다.
대체 접근 방식
직접 문자열을 유형으로 변환할 수는 없지만 다음이 있습니다. 동적 개체 생성을 위한 대체 기술:
1. 매핑 구조 사용:
클래스 이름(문자열)과 해당 클래스의 인스턴스를 생성하는 함수 포인터 간의 매핑을 생성할 수 있습니다. 이를 통해 함수 포인터를 찾아 호출하여 동적 객체 생성이 가능합니다.
template <typename T> Base* createInstance() { return new T; } std::map<std::string, Base*(*)()> map; map["DerivedA"] = &createInstance<DerivedA>; // ... and so on
2. 자동 클래스 등록:
이 방법에는 매크로나 템플릿을 사용하여 컴파일하는 동안 클래스를 등록하는 방법이 포함됩니다. 등록된 클래스는 자동으로 글로벌 맵에 추가되므로 해당 이름을 사용하여 등록된 클래스에서 개체를 생성할 수 있습니다.
#define REGISTER_DEC_TYPE(NAME) \ static DerivedRegister<NAME> reg #define REGISTER_DEF_TYPE(NAME) \ DerivedRegister<NAME> NAME::reg(#NAME) class DerivedB { ...; REGISTER_DEF_TYPE(DerivedB); };
3. Boost 변형 사용:
관련되지 않은 유형의 객체를 생성해야 하는 시나리오의 경우 Boost 라이브러리는 변형
typedef boost::variant<Foo, Bar, Baz> variant_type; template <typename T> variant_type createInstance() { return variant_type(T()); }
결론
C에는 직접 문자열이 부족하지만 -type 변환, 이 문서에서 설명하는 대체 접근 방식은 문자열에서 개체를 동적으로 인스턴스화하는 수단을 제공합니다. 매핑 구조, 자동 클래스 등록 또는 Boost 변형 유형을 활용하여 개발자는 객체 지향 애플리케이션에서 더 큰 유연성과 코드 유지 관리성을 얻을 수 있습니다.
위 내용은 클래스 이름 문자열에서 C 개체를 동적으로 인스턴스화하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!