C의 클래스 이름 문자열에서 객체를 인스턴스화할 수 있습니까?
C에는 클래스 이름을 나타내는 문자열에서 객체를 인스턴스화하는 메커니즘이 있습니까? , 팩토리에서 잠재적으로 파생된 각 클래스에 대해 if-else 문을 명시적으로 정의할 필요가 없습니다. 클래스?
문제:
다음 클래스 구조를 고려하세요.
class Base; class DerivedA : public Base; class DerivedB : public Base; // etc...
그리고 해당 팩토리 클래스인 BaseFactory는 파생 클래스의 인스턴스를 생성합니다. 지정된 클래스 이름 문자열을 기반으로 하는 클래스:
class BaseFactory { public: BaseFactory(std::string &sClassName) { msClassName = sClassName; }; Base * Create() { if(msClassName == "DerivedA") { return new DerivedA(); } else if(msClassName == "DerivedB") { return new DerivedB(); } // etc... }; private: string msClassName; };
그러나 이 접근 방식에는 명시적인 요구 사항이 필요합니다. BaseFactory 내에서 각 파생 클래스를 지정하는 것은 파생 클래스 수가 증가함에 따라 번거로울 수 있습니다.
해결책:
C#과 같은 언어와 달리 C는 본질적으로 다음을 제공하지 않습니다. 런타임 유형 정보를 기반으로 객체를 동적으로 생성하는 메커니즘입니다. 유사한 기능을 달성하려면 클래스 이름과 객체 생성 함수 간의 매핑 구성을 고려할 수 있습니다.
template<typename T> Base * createInstance() { return new T; } typedef std::map<std::string, Base*(*)()> map_type; map_type map; map["DerivedA"] = &createInstance<DerivedA>; map["DerivedB"] = &createInstance<DerivedB>;
이 맵을 사용하면 객체 인스턴스화는 다음과 같이 됩니다.
return map[some_string]();
또는 다음과 같이 등록할 수 있습니다. 프로그램 초기화 중에 자동으로 파생 클래스:
template<typename T> struct DerivedRegister : BaseFactory { DerivedRegister(std::string const& s) { getMap()->insert(std::make_pair(s, &createT<T>)); } }; // in derivedb.hpp class DerivedB { ...; private: static DerivedRegister<DerivedB> reg; }; // in derivedb.cpp: DerivedRegister<DerivedB> DerivedB::reg("DerivedB");
이 접근 방식을 사용하면 자동으로 발생하므로 수동 클래스 등록이 필요하지 않습니다.
요약:
C는 클래스 이름 문자열에서 개체 인스턴스화를 직접 지원하지 않지만 이러한 기술은 매핑을 통해 유사한 기능을 달성하는 방법을 제공합니다. 클래스 이름을 객체 생성 기능에 추가하거나 등록 프로세스를 자동화합니다.
위 내용은 C가 클래스 이름 문자열에서 개체를 인스턴스화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!