"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 클래스 이름 문자열에서 C++ 개체를 동적으로 인스턴스화하려면 어떻게 해야 합니까?

클래스 이름 문자열에서 C++ 개체를 동적으로 인스턴스화하려면 어떻게 해야 합니까?

2024년 12월 25일에 게시됨
검색:962

How Can I Instantiate C   Objects Dynamically from Class Name Strings?

클래스 이름 문자열에서 유연한 객체 인스턴스화

소개

객체 지향 프로그래밍에서는 인스턴스화하는 것이 일반적인 관행입니다. 특정 클래스의 객체. 그러나 특정 시나리오에서는 문자열로 저장된 클래스 이름을 기반으로 개체를 동적으로 생성하는 것이 유리할 수 있습니다. 이는 향상된 유연성과 코드 유지 관리성을 제공할 수 있습니다. 이 기사에서는 C에서 이러한 동적 객체 생성을 달성할 수 있는 가능성을 살펴봅니다.

문자열-유형 변환을 사용한 동적 객체 인스턴스화

안타깝게도 C는 기본적으로 클래스 이름을 보유한 문자열을 실제 유형 정보로 변환하는 직접적인 메커니즘입니다. 이는 명시적인 코드 변경 없이는 정적으로 정의된 클래스를 동적으로 인스턴스화할 수 없음을 의미합니다.

대체 접근 방식

직접 문자열을 유형으로 변환할 수는 없지만 다음이 있습니다. 동적 객체 생성을 위한 대체 기술:

1. 매핑 구조 사용:

클래스 이름(문자열)과 해당 클래스의 인스턴스를 생성하는 함수 포인터 간의 매핑을 생성할 수 있습니다. 이는 함수 포인터를 찾아 호출하여 동적 객체 생성을 허용합니다.

template  Base* createInstance() { return new T; }

std::map<:string base> map;
map["DerivedA"] = &createInstance;  // ... and so on

2. 자동 클래스 등록:

이 방법에는 매크로나 템플릿을 사용하여 컴파일하는 동안 클래스를 등록하는 방법이 포함됩니다. 등록된 클래스는 전역 맵에 자동으로 추가되므로 해당 이름을 사용하여 등록된 클래스에서 객체를 생성할 수 있습니다.

#define REGISTER_DEC_TYPE(NAME) \
    static DerivedRegister reg

#define REGISTER_DEF_TYPE(NAME) \
    DerivedRegister NAME::reg(#NAME)

class DerivedB {
    ...;
    REGISTER_DEF_TYPE(DerivedB);
};

3. Boost 변형 사용:

관련되지 않은 유형의 객체를 생성해야 하는 시나리오의 경우 Boost 라이브러리는 변형 유형을 제공합니다. 이 유형은 저장된 유형 정보를 기반으로 동적으로 액세스할 수 있는 다양한 유형의 값을 보유할 수 있습니다.

typedef boost::variant variant_type;
template  variant_type createInstance() { return variant_type(T()); }

결론

C에는 문자열을 유형으로 직접 변환하는 기능이 없지만 이 문서에서 설명하는 대체 접근 방식은 문자열에서 개체를 동적으로 인스턴스화하는 방법을 제공합니다. 매핑 구조, 자동 클래스 등록 또는 Boost 변형 유형을 활용하여 개발자는 객체 지향 애플리케이션에서 더 큰 유연성과 코드 유지 관리성을 얻을 수 있습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3