Я изо всех сил, чтобы понять, почему инициализация pprocessor, ниже, написано так:Какова цель этого кода?
class X
{
...
private:
boost::scoped_ptr<f_process> pprocessor_;
};
X:X()
: pprocessor_(f_process_factory<t_process>().make()) //why the factory with template
{...}
вместо того, чтобы просто писать
X:X()
: pprocessor_(new t_process())
{...}
Другие соответствующие коды:
class f_process {
...
};
class t_process : public f_process {
...
};
//
class f_process_factory_base {
public:
f_process_factory_base() { }
virtual ~f_process_factory_base() = 0 { }
virtual f_process* make() = 0;
};
template < typename processClass >
class f_process_factory : public f_process_factory_base {
public:
f_process_factory() { }
virtual ~f_process_factory() { }
virtual processClass* make() { return new processClass(); }
};
Парень, который написал код, очень умный, поэтому, возможно, для этого есть веская причина.
(я не могу связаться с ним, чтобы задать вопрос)
за исключением того, что он не создает различные типы 't_process'. Он вызывает фабрику 't_process', которая вызывает' new t_process(); ', класс' t_process' является конкретным. – Stephen
Как вы можете быть уверены, какую фабрику она использует, а что, если есть несколько заводов? Ведь заводские методы не статичны. Он может указывать на другой класс, другой, который указан в примере кода и использует полиморфизм для создания экземпляра процесса. –
Я могу быть уверен, потому что он строит временную фабрику 't_process' прямо там при инициализации' pprocessor_', а затем вызывает 'make()' на ней :) – Stephen