> 백엔드 개발 > C++ > C가 클래스 이름 문자열에서 개체를 인스턴스화할 수 있습니까?

C가 클래스 이름 문자열에서 개체를 인스턴스화할 수 있습니까?

Susan Sarandon
풀어 주다: 2024-12-26 05:37:44
원래의
387명이 탐색했습니다.

Can C   Instantiate Objects from Class Name Strings?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿