我正在開發一個個人項目,以熟悉C++ 11和Boost。C++ 11智能指針的複合模式
我與UrlExtractor
基類有一個繼承關係,TagUrlExtractor
派生類和CompoundExtractor
派生類。 A CompoundExtractor
可以包含任意數量的UrlExtractors
,從而實現composite pattern。
我很好奇CompositeExtractor.addExtractor
的方法簽名應該是什麼樣子。由於我正在處理多態類型,我不得不使用指針(或引用)。我想使用新的智能指針,特別是shared_ptr
。
我試着寫這樣的addExtractor
成員函數:
void addExtractor(shared_ptr<UrlExtractor> extractor);
不過,我得到一個編譯錯誤,如果我嘗試寫:
compound.addExtractor(new TagUrlExtractor());
的問題,將採取兩個隱含的轉換爲創建一個shared_ptr<UrlExtractor>
:一個到UrlExtractor
基類,第二個到shared_ptr
。
我可以調用該函數是這樣的:
compound.addExtractor(shared_ptr<UrlExtractor>(new TagUrlExtractor));
然而,這是非常冗長。這種情況如何正常處理?
這實際上消除了需要做一個明確的'新'。非常好! –
@TravisParks:事實上,在C++ 11中,除非您正在進行真正的低級別內存管理(如編寫自己的容器等),否則幾乎不需要使用'new',而在C++ 14中,您可以刪除「幾乎」 - 感謝'std :: make_unique()';-) –
@AndyProwl:我會爭辯說'new'仍然很常見,直到我們得到'make_unique'('unique_ptr'常常是最好的選擇) 。另一方面,「刪除」在C++ 11代碼中應該幾乎不存在(好信息)。 – Grizzly