Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 此代码的目的是什么?_C++_Templates_Initialization_Factory - Fatal编程技术网

C++ 此代码的目的是什么?

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 { ...

我很难理解为什么下面的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 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(); }
};