2014-05-13 4 views
0

특정 파일에 지정된 모든 클래스를 기반으로 런타임에 모든 파생 클래스 (및 클래스 이름)를 생성하는 팩터 리를 생성 할 수 있습니까?팩토리는 어떻게하면 특정 파일을보고 가능한 모든 클래스를 결정할 수 있습니까?

class Laptop: public Computer { 
    public: 
    virtual void Run(){mHibernating = false;} 
    virtual void Stop(){mHibernating = true;} 
private: 
    bool mHibernating; // Whether or not the machine is hibernating 
}; 

class Desktop: public Computer { 
public: 
    virtual void Run(){mOn = true;} 
    virtual void Stop(){mOn = false;} 
private: 
    bool mOn; // Whether or not the machine has been turned on 
}; 

// ....[more classes derived from Computer]... 

이 공장은 자신의 이름을 기반으로 매핑 할 수 클래스 목록을 생성 할 수 있습니다 예를 들어

는 사용자가 지속적으로 파생 클래스를 추가하는 특정 파일을 주어진?

class ComputerFactory { 
public: 
    static Computer *NewComputer(const std::string &description) 
    { 
     if(description == "Laptop") 
      return new Laptop; 
     } else if (description == "Desktop") { 
      return new Desktop; 
     } else if // ...[more comparisons based on the classes defined at runtime]... 
     } else return NULL; 
    } 
}; 
+2

소스 파일에 몇 가지 추가 정보가 없으면이 작업을 수행 할 수 없습니다. 이것을하는 일반적인 방법은'REGISTER_TYPE' 매크로를 사용하여 관련 정보를 어떤 방식 으로든 사용할 수있게 만든 다음'REGISTER_TYPE (Laptop)','REGISTER_TYPE (컴퓨터)'등으로 바꾸는 것입니다. – Mankarse

+1

왜 같은 사용자 누가 파일에 클래스를 계속 추가하고지도를 유지합니까? – StoryTeller

+0

@ sgarza62 짧은 대답은 아니오입니다. 당신이 할 수있는 일은 파일을 들여다보고있는 클래스를 식별하는 외부 도구를 작성하는 것입니다. 그 도구는 당신을 위해 공장을 생성 할 수 있습니다. – Raxvan

답변

1

파서를 작성하고 클래스에서 입력 파일을 처리하도록 할 수는 있지만 사용자가 원하는 것은 아닌지 의심 스럽습니다.

당신은 또한 당신의 이점에 CRTP 패턴을 사용할 수 있습니다

template<class T> 
struct Base 
{ 
    Base() 
    { 
     reg; 
    } 
    virtual std::string name() = 0; 
    static bool reg; 
    static bool init() 
    { 
     T t; 
     Factory::registerClass(t.name()); 
     return true; 
    } 
}; 

template<class T> 
bool Base<T>::reg = Base<T>::init(); 

source

당신은 다음

struct Derived1 : Base<Derived1> 
{ 
... 
} 

으로 클래스를 파생 것

이 자동으로 부여 Factory하여 클래스를 등록 할 그 이름 (순수하지 않기 때문에 추상이 아닌 클래스에 name을 구현해야합니다.).

또한 파생 클래스를 만드는 방법을 알고있는 registerClass에 콜백을 전달할 수 있습니다.

+0

+1, 내가 CRTP를 사용하는 것을 좋아하기 때문에 :) – StoryTeller