介绍
本篇内容介绍了“C + +中怎么使用工厂函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
<节> <节> <节> <节> <节>如果在构造过程中需要“虚行为”,使用工厂函数,节> 节> 节> 节> 节> <节> <节> <节> <节> <>部分原因(原因)节> 节> 节> 节> 节>如果基类对象的状态必须依赖对象的派生部分,我们需要使用虚函数(或等价物)以便尽量压缩没有完美构造完成的对象被错误使用的时间窗口。
工厂的返回类型通常应该默认返回unique_ptr;如果有些用法需要共享,调用者可以将unique_ptr移动到要。然而,如果工厂的作者知道返回对象的所有的用法都是共享方式,也可以返回要,这样在函数体内部可以使用make_shared节约一次内存分配。
<节> <节> <节> <节> <>部分例子,坏(反面示例)节> 节> 节> 节> 节><代码> B类{<节> <节> <节> <节> <>部分例子(示例)节> 节> 节> 节> 节>
公共:
,,B () {
,,,,/*……*/
,,,,f ();//坏:C.82:不要# 39;t在构造函数和析构函数调用虚函数
,,,,/*……*/
,,}
,,虚拟空间f ()=0;
}; 代码>
<代码> B类{<节>
保护:
,,类标记{};公共:
,,明确B(令牌){/*……*/},//
创建一个完全初始化对象,,虚拟空间f ()=0;
,,template<类T>
,,静态shared_ptrcreate (),,//接口用于创建共享对象
,,{
,,,,汽车p=make_shared(typename T:令牌{});
,,,,p→post_initialize ();
,,,,返回p;
,,保护}
:
,,虚拟空间post_initialize (),//后称为建设
,,,,{/*……*/f ();/*……*/}//好:虚拟调度安全
};
类D:公共B {,,,,,,,,//派生类
保护:
,,类标记{};公共:
,,显式D(令牌):B {B::令牌{}}{}
,,空白f()覆盖{/*……,*/};
保护:
,,template<类T>
,,朋友shared_ptrB::创建();
};
shared_ptrp=D: create ();,//创建一个D对象代码>
make_shared调用的构造函数必须是公开的。通过要求一个保护的令牌保证构造函数不能被公开调用,这样我们就避免了不完全构造的对象流出。由于提供了一个工厂方法创建(),(自由存储上的)构造过程可以便利地实施。
注意(注意)
常规的工厂方法在自由存储上分配对象内存,而不是在堆栈或者封闭的对象内。