클래스 이름이 포함된 문자열에서 개체를 인스턴스화하는 방법은 무엇입니까?
주어진 코드에서 BaseFactory 클래스는 다양한 파생 클래스의 개체를 생성합니다. 클래스 이름을 나타내는 문자열을 기반으로 합니다. 그러나 팩토리에서는 가능한 각 Derived 클래스에 대해 if 문을 수동으로 추가해야 합니다. C#의 Reflection 기능과 유사한 이러한 장황한 접근 방식에 대한 대안이 있는지 궁금할 수도 있습니다.
안타깝게도 자동화된 메커니즘은 없습니다
불행히도 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]();
유형 등록
대안 솔루션은 유형이 스스로 등록되도록 허용하는 것입니다.
// w base.hpp: template<typename T> Base * createT() { return new T; } struct BaseFactory { typedef std::map<std::string, Base*(*)()> map_type; static Base * createInstance(std::string const& s) { map_type::iterator it = getMap()->find(s); if(it == getMap()->end()) return 0; return it->second(); } protected: static map_type * getMap() { // nigdy nie usuwane (istnieje do zakończenia programu) // ponieważ nie możemy zagwarantować poprawnej kolejności usuwania if(!map) { map = new map_type; } return map; } private: static map_type * map; }; template<typename T> struct DerivedRegister : BaseFactory { DerivedRegister(std::string const& s) { getMap()->insert(std::make_pair(s, &createT<T>)); } }; // w derivedb.hpp class DerivedB { ...; private: static DerivedRegister<DerivedB> reg; }; // w derivedb.cpp: DerivedRegister<DerivedB> DerivedB::reg("DerivedB");
매크로를 정의할 수도 있습니다. 유형 등록:
#define REGISTER_DEC_TYPE(NAME) \ static DerivedRegister<NAME> reg #define REGISTER_DEF_TYPE(NAME) \ DerivedRegister<NAME> NAME::reg(#NAME)
공통 기본 클래스를 공유하지 않는 유형의 경우 변형을 사용할 수 있습니다. 함수의 반환 유형인 Boost::variant:
typedef boost::variant<Foo, Bar, Baz> variant_type; template<typename T> variant_type createInstance() { return variant_type(T()); } typedef std::map<std::string, variant_type (*)()> map_type;
위 내용은 클래스 이름이 포함된 문자열에서 C 개체를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!