2011-01-20 4 views
2

팩토리 메소드 설정의 일종으로 각각 다른 유형의 객체를 만들지 만 공통 인터페이스를 충족시키는 - 즉 모두 핵심 클래스를 서브 클래 싱하는 객체를 만드는 펑터를 등록하려고합니다. 각 FactoryMethod 템플릿 특수화는 별도의 형태이기 때문에다른 템플릿 매개 변수가있는 템플릿 객체의 집합

template <class T> struct FactoryMethod 
{ 
X* create(); 
} 
내가 가질 수 없습니다

(IIRC) std::map<std::string,FactoryMethod*> :

내가 뭔가를 말해봐. 하지만는 할 수 :

struct IFactoryMethod 
{ 
virtual X* create()=0; 
}; 
template <class T> struct FactoryMethod : public IFactoryMethod 
{ 
virtual X* create(); 
}; 
std::map<std::string,IFactoryMethod*> factories; 

오른쪽? 나는 STL에 표준이 있다는 것을 알지 못합니다. 부스트가 그렇다고해도 깔끔하게 만들 수있는 방법이 있습니다.하지만 지금은 부스트를 사용하지 않고 어쨌든 관심이 있습니다.

그런 다음 올바른 유형을 만들기 위해 factories을 유형 이름 (예 : XML에서 읽음)을 기반으로 조회 할 수 있습니다.

답변

1

이것은 형식 지우기로 알려져 있으며 꽤 일반적인 관용구입니다.지도는 물론 소유권을 강제하는 포인터로 만들 수 있지만 대부분의 정상적인 사람처럼 가상 소멸자를 사용할 수도 있습니다.

+0

의사 코드입니다. 휴식을주세요! "소유권 위임 포인터"를 분명히 할 수 있습니까? –

+1

그는 기본적으로 원시 포인터를 사용하지 말라고 지시하고 대신 shared_ptr 또는 unique_ptr 를 사용하여 포인터로 안전하게 작업 할 수 있습니다. 그들은 boost에서 왔고 std :: tr1 또는 std in C++ 0x에서 찾을 수 있습니다. 여기를보실 수 있습니다 : http://www.boost.org/doc/libs/1_38_0/doc/html/boost/interprocess/unique_ptr.html – MatiasFG

+1

pah, 남자는 포인터를 두려워하지 않습니다! –