C++中怎么使用工厂函数

本篇内容介绍了“C++中怎么使用工厂函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

如果在构造过程中需要“虚行为”,使用工厂函数 Reason(原因)

如果基类对象的状态必须依赖对象的派生部分,我们需要使用虚函数(或等价物)以便尽量压缩没有完美构造完成的对象被错误使用的时间窗口。

Note(注意)

工厂的返回类型通常应该默认返回unique_ptr;如果有些用法需要共享,调用者可以将unique_ptr移动到shared_ptr。然而,如果工厂的作者知道返回对象的所有的用法都是共享方式,也可以返回shared_ptr,这样在函数体内部可以使用make_shared节约一次内存分配。

Example, bad(反面示例)
class B {
public:
   B() {
       /* ... */
       f(); // BAD: C.82: Don't call virtual functions in constructors and destructors
       /* ... */
   }

   virtual void f() = 0;
};
Example(示例)
class B {
protected:
   class Token {};

public:
   explicit B(Token) { /* ... */ }  // create an imperfectly initialized object
   virtual void f() = 0;

   template<class T>
   static shared_ptr<T> create()    // interface for creating shared objects
   {
       auto p = make_shared<T>(typename T::Token{});
       p->post_initialize();
       return p;
   }

protected:
   virtual void post_initialize()   // called right after construction
       { /* ... */ f(); /* ... */ } // GOOD: virtual dispatch is safe
};

class D : public B {                 // some derived class
protected:
   class Token {};

public:
   explicit D(Token) : B{ B::Token{} } {}
   void f() override { /* ...  */ };

protected:
   template<class T>
   friend shared_ptr<T> B::create();
};

shared_ptr<D> p = D::create<D>();  // creating a D object

make_shared调用的构造函数必须是公开的。通过要求一个保护的令牌保证构造函数不能被公开调用,这样我们就避免了不完全构造的对象流出。由于提供了一个工厂方法create(),(自由存储上的)构造过程可以便利地实施。

Note(注意)

常规的工厂方法在自由存储上分配对象内存,而不是在堆栈或者封闭的对象内。

“C++中怎么使用工厂函数”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注蜗牛博客网站,小编将为大家输出更多高质量的实用文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论

有免费节点资源,我们会通知你!加入纸飞机订阅群

×
天气预报查看日历分享网页手机扫码留言评论电报频道链接