에 오신 것을 환영합니다 :)
당신은 당신이 그 객체를 생성하기 위해 Factory
을해야한다는 올바른지, 그러나 당신은 파일 당 하나의 Factory
이 필요하지 않을 수 있습니다.
은 모든 instanciable 클래스를 데에가는 일반적인 방법은 당신이 당신에게 할 때마다 std::unique_ptr<Base>
서비스를 제공하는 하나의 Factory
이 필요합니다 수 있도록 우리가 Base
를 호출한다는 공통 기본 클래스에서 파생.
구현하는 두 가지 방법이있는 Factory
: 당신은 Prototype
패턴을 사용하고 clone
함수가 호출 될에 만들 수있는 클래스의 인스턴스를 등록 할 수 있습니다
- .
- 당신은 함수에 대한 포인터 또는 (C++ 0X 또는
std::function<Base*()>
) 펑터 물론
어려움이 동적으로 이러한 항목을 등록하는 것입니다 등록 할 수 있습니다. 이는 일반적으로 정적 초기화 중에 시작될 때 수행됩니다.
// OO-way
class Derived: public Base
{
public:
virtual Derived* clone() const { return new Derived(*this); }
private:
};
// start-up...
namespace { Base* derived = GetFactory().register("Derived", new Derived); }
// ...or in main
int main(int argc, char* argv[])
{
GetFactory().register("Derived", new Derived(argv[1]));
}
// Pointer to function
class Derived: public Base {};
// C++03
namespace {
Base* makeDerived() { return new Derived; }
Base* derived = GetFactory().register("Derived", makeDerived);
}
// C++0x
namespace {
Base* derived = GetFactory().register("Derived", []() { return new Derived; });
}
시동 방식의 가장 큰 장점은 완벽하게 거기에 등록을 자체 파일에 Derived
클래스를 정의 감싸 할 수 있으며, 다른 파일이 변경에 의해 영향을하지 않습니다. 이것은 의존성을 다루기에 좋습니다.
반면에 생성하려는 프로토 타입에 외부 정보/매개 변수가 필요한 경우 초기화 메소드를 사용해야합니다. 가장 간단한 방법은 인스턴스를 main
(또는 이와 동등한 것)에 등록하는 것입니다. 필요한 매개 변수가 있습니다.
빠른 참고 : 후속 질문에 대해서 ...
기능 방법에 대한 포인터가 가장 경제적 (메모리)와 (실행)에서 가장 빠른이지만, 구문이 이상해.
네, 아마도 직접적으로하지만, 함수에 유형을 통과 할 수 있습니다 : 문제의 유형이 컴파일 타임에 알려진 경우 당신은 몇 가지가 필요합니다하지만
이
- , 당신은 템플릿을 사용할 수 있습니다 시간은 구문을 알고 당신이
object.class
에 가까운 무언가를 전달해야하는 경우에, 당신은 공장 출하 방법을
를 ID의 어떤 종류를 전달하고 사용해야합니다하지 않을 경우는
그것은 나에게 보인다하세요 당신은 이중 파견 유스 케이스에 접근하고 있습니다. 그리고 Visitor
패턴을 살펴볼 가치가 있습니다.
후속 조치로 C++에서 "유형"을 전달할 수 있습니까? 즉. Foo 객체가 아니라 Foo 클래스를 함수의 매개 변수로 전달할 수 있습니까? 내가 생각하고있는 Java 동급 클래스는 Class 매개 변수를 사용하는 메서드이며 Foo.class를 전달할 수 있습니다. – Greencpp