C++ 此代码的目的是什么?
我很难理解为什么下面的pprocessor初始化是这样写的:C++ 此代码的目的是什么?,c++,templates,initialization,factory,C++,Templates,Initialization,Factory,我很难理解为什么下面的pprocessor初始化是这样写的: class X { ... private: boost::scoped_ptr<f_process> pprocessor_; }; X:X() : pprocessor_( f_process_factory<t_process>().make() ) //why the factory with template {...} 其他相关代码为: class f_process { ...
class X
{
...
private:
boost::scoped_ptr<f_process> pprocessor_;
};
X:X()
: pprocessor_( f_process_factory<t_process>().make() ) //why the factory with template
{...}
其他相关代码为:
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(); }
};
class f_过程{
...
};
类t_进程:公共f_进程{
...
};
//
f类工艺工厂基地{
公众:
f_进程_工厂_基(){}
虚拟~f_进程\u工厂\u基()=0{}
虚拟f_进程*make()=0;
};
模板
f_过程工厂类:公共f_过程工厂库{
公众:
f_过程_工厂(){}
虚拟~f_进程_工厂(){}
虚拟processClass*make(){返回新的processClass();}
};
编写代码的人非常聪明,因此可能有一个很好的理由。(我无法联系他询问)看起来他正在使用创建t_流程的新实例。这将允许您将创建不同类型的t_进程的责任委托给X类以外的人员这看起来像是他在使用创建t_进程的新实例。这将允许您将创建不同类型的t_进程的责任委托给X类以外的人。在这种情况下,这没有多大意义,除非作者预期默认工厂的定义将在将来某个时候更新。不过,如果工厂对象作为参数传入,这是有意义的;工厂在构造对象时提供了更大的灵活性,但是如果在使用工厂的同一位置实例化工厂,那么它实际上并没有什么优势。所以,你是对的。在这种情况下,这没有多大意义,除非作者期望默认工厂的定义在将来某个时候更新。不过,如果工厂对象作为参数传入,这是有意义的;工厂在构造对象时提供了更大的灵活性,但是如果在使用工厂的同一位置实例化工厂,那么它实际上并没有什么优势。所以,你是对的。事实上,这似乎有点毫无意义,但我可以想到一些可能的用途,这里没有展示,但将来可能会有用:
- 内存管理:有可能在将来的某个时候,原作者预期
需要不同的分配方案。例如,他可能希望重用旧对象或从竞技场分配新对象t\u进程
- 跟踪创建:当创建对象时,
可能会收集统计数据。也许工厂可以保持一些静态f\u流程\u工厂
- 绑定构造函数参数:在将来的某个时候,
t\u进程的
可能需要将构造函数参数传递给f\u进程工厂
创建者,但是t\u进程
不想知道它们X
- 准备依赖项注入:可以专门化这些工厂以返回模拟,而不是真正的
。这可以通过几种方式实现,但并不完全是书面形式t\u进程
- 专门化对象创建:(这实际上只是前两种情况的一般情况),可能会有在不同情况下创建的
的专门化-例如,它可能会基于环境变量或操作系统创建不同的t\u进程
类型。这需要工厂进行专业化t\u进程
如果是我,而且这些听起来都不合理,我可能会把它撕掉,因为这似乎是无缘无故的设计模式用法。事实上,这似乎有点毫无意义,但我可以想到一些可能的用法,这里没有显示,但将来可能会有用:
- 内存管理:有可能在将来的某个时候,原作者预期
需要不同的分配方案。例如,他可能希望重用旧对象或从竞技场分配新对象t\u进程
- 跟踪创建:当创建对象时,
可能会收集统计数据。也许工厂可以保持一些静态f\u流程\u工厂
- 绑定构造函数参数:在将来的某个时候,
t\u进程的
可能需要将构造函数参数传递给f\u进程工厂
创建者,但是t\u进程
不想知道它们X
- 准备依赖项注入:可以专门化这些工厂以返回模拟,而不是真正的
。这可以通过几种方式实现,但并不完全是书面形式t\u进程
- 专门化对象创建:(这实际上只是前两种情况的一般情况),可能会有在不同情况下创建的
的专门化-例如,它可能会基于环境变量或操作系统创建不同的t\u进程
类型。这需要工厂进行专业化t\u进程
如果是我,而且这些听起来都不可信,我可能会把它撕掉,因为这似乎是无缘无故的设计模式用法。除了它不会创建不同类型的
t\u进程之外。它调用一个调用新t_进程()的t_进程
工厂
,t\u进程
类是具体的。如何确定它使用的是哪个工厂,如果有多个工厂呢?毕竟,所有工厂方法都不是静态的。它可能指向示例代码中提到的另一个类,并使用多态性来创建流程实例。我可以确定,因为它在初始化pprocessor\uu时构建了一个临时t\u流程
工厂,然后调用make()
在它上面:)除了它不会创建不同类型的t\u进程
。它调用一个
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(); }
};