您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“C++中怎么使用工廠函數(shù)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
如果基類對象的狀態(tài)必須依賴對象的派生部分,我們需要使用虛函數(shù)(或等價物)以便盡量壓縮沒有完美構(gòu)造完成的對象被錯誤使用的時間窗口。
工廠的返回類型通常應(yīng)該默認(rèn)返回unique_ptr;如果有些用法需要共享,調(diào)用者可以將unique_ptr移動到shared_ptr。然而,如果工廠的作者知道返回對象的所有的用法都是共享方式,也可以返回shared_ptr,這樣在函數(shù)體內(nèi)部可以使用make_shared節(jié)約一次內(nèi)存分配。
class B {
public:
B() {
/* ... */
f(); // BAD: C.82: Don't call virtual functions in constructors and destructors
/* ... */
}
virtual void f() = 0;
};
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調(diào)用的構(gòu)造函數(shù)必須是公開的。通過要求一個保護(hù)的令牌保證構(gòu)造函數(shù)不能被公開調(diào)用,這樣我們就避免了不完全構(gòu)造的對象流出。由于提供了一個工廠方法create(),(自由存儲上的)構(gòu)造過程可以便利地實施。
Note(注意)
常規(guī)的工廠方法在自由存儲上分配對象內(nèi)存,而不是在堆?;蛘叻忾]的對象內(nèi)。
“C++中怎么使用工廠函數(shù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。