2011-01-24 77 views
12

一個新手的問​​題:我有個教學班,一些虛擬功能的層次,我想實現一個工廠方法,但我不知道什麼是最好的方法:在C++中實現工廠方法的首選方法是什麼?

  1. 返回原始指針從工廠方法並將其包裝到調用方法中的智能指針中
  2. 返回工廠的智能指針
  3. 從工廠返回一個正確的對象(但它是否正確複製派生類?)並將其分配給調用方法中的本地對象
  4. 返回工廠的引用(但是如何創建在工廠方法中的對象沒有內存泄漏?)

我將不勝感激的工廠方法和最小的客戶端,這是有效的,不泄漏內存的例子。

我的背景是C#和Java,所以我有點在C++ atm中的內存管理中丟失了。

回答

8

選項3和選項4從一開始就沒有了,因爲它們根本不起作用:3個對象片,4個創建內存泄漏或無效引用。

從其他兩種方法中,我強烈推薦2:返回一個智能指針。事實上,如果可能的話,儘量避免使用原始指針。不幸的是,C++使得寫這麼多東西成爲可能(而且這不是一個微不足道的反對!任何曾經用C++寫過面向對象的代碼,並且使用智能指針的人都感到痛苦),但是替代方案更加痛苦。

當然,替代方案5:使用原始指針和垃圾回收器。

+0

實際上,持續返回`boost :: shared_ptr`通常是一個好主意。這不是一個很大的痛苦(至少比原始指針更痛苦)。由於大多數多態層次結構是由不可複製的對象組成的(即不提供`clone`方法),共享語義往往是你想要的。雖然謹防循環依賴。 – 2011-01-24 18:34:33

+1

@Alexandre:根據我的經驗,循環依賴是真的,非常罕見。至少當你不使用事件/信號時。那些弱引用(即普通指針)可能始終是最好的解決方案。不知道。說實話,從來沒有用C++做過。 – 2011-01-24 18:55:07

4

好我的口味去返回一個智能指針。 here是指向返回智能指針的示例抽象工廠的鏈接。

my2c

3

我更喜歡方法1,因爲它更靈活。但是,返回原始指針還是智能指針實際上只是對象使用的問題。例如,您可能想要返回一個原始指針,因爲您知道該對象有時會被使用一次,並立即在相同的代碼塊中被刪除。在這種情況下,不需要承擔構建智能指針對象的開銷。但是,如果對象的生命週期總是不確定,並且擔心內存泄漏,那麼通過所有方法都可以使用方法2.方法3和4不正確。

1

您需要內存管理,沒有其他可行的選擇。但是,您可能不需要工廠方法中的內存管理。

智能指針的主要問題是缺少協方差,這在實現clone虛擬方法時很痛苦。不幸的是協變規則在C++ 0x中沒有放寬,所以它仍然是一個問題。另一方面,返回一個原始指針並將其留給調用者來包裝它,正在打開bug的大門(儘管它是Boost爲它的克隆選擇的方法)。

就個人而言,我建議:

  • 臭名昭著auto_ptr或一個普通的指針調用者應在包裝C++ 03
  • 一個unique_ptr只要你的編譯器得到它

後者結合了大多數優點(拋開協方差),並且幾乎沒有性能開銷。

0

與方法1已經掙扎後,我可以向你保證,方法2,要麼返回boost::shared_ptrboost::scoped_ptr(通常前者是你想要什麼,如果你沒有std::unique_ptr訪問)是什麼,我全心全意支持建議。

相關問題