2015-11-05 127 views
-1

我想知道參數化構造函數應該總是隻有實際初始化類的屬性的參數。例如,在呼喚:C++參數化構造函數

Texture background("C:\Documents\Images\background.png"); 

,如果我不需要存儲文件的路徑是什麼?

+1

我從來沒有聽說過任何這樣的規則。你在哪裏提出這樣的想法,可能會失望?如果指向的文件不存在(例如,如果您未能避免反斜槓),那麼您的示例可能存在問題,其他人可能會遇到問題,那麼您必須認真思考如何處理該故障。 – sh1

+0

我假設你實際上需要使用路徑,即使你不保存它。在那種情況下,提供它。如果你打算稍後加載它,那麼在構造函數中你並不需要它。你可以有一個公開的方法來提供它。但提供參數作爲選項沒有任何問題。擁有各種構造函數的能力是OOP的最大特性之一。 – Frecklefoot

+0

有趣 - 告訴'std :: ifstream'或者'std :: ofstream',正在做什麼是有爭議的。 http://en.cppreference.com/w/cpp/io/basic_ifstream/basic_ifstream – PaulMcKenzie

回答

0

對象構造函數需要返回有效的功能對象所需的任何參數。您可以允許構造函數使用語法糖的額外參數,但至少您的對象應該是有效的。在你的情況下,如果沒有用作紋理的文件,我認爲紋理沒有意義,所以我認爲不推薦去除該參數。

請記住,您還應該致力於讓您的代碼易於測試。在這種情況下,當你想實例化一個對象來測試特定的方法時,複雜的構造函數會很痛苦。最後,這更多的是一個決策過程。

0

如果您不需要存儲路徑,那麼請不要將它傳遞給構造函數! :)

參數化構造函數旨在確保在實例化對象時所有信息都可用。因此只傳遞必要的信息。

如果您想遵循RAII習慣用法,則將所有需要的資源傳遞給構造函數並釋放資源(如果對象鎖定它們,如文件或端口)。

0

我不認爲接受不直接存儲在類中的參數有任何問題。顯然,如果它根本不影響班級,那麼這只是浪費時間,但是你可能會接受像PRNG種子那樣的東西,你用它來隨機化地填充你的班級,並且沒有理由保留這個種子以外的種子點。

但是,傳遞文件路徑意味着要在構造函數中訪問是危險的,因爲在該過程中可能會出現許多問題。你真的不想在你的構造函數中遇到這樣的麻煩。

爲了避免構造函數中潛在的失敗情況,您最終將文件訪問延遲到構造之後。因此,構造函數實際上不需要這些信息,因爲將它傳遞給用來訪問文件的方法會更加合理,因爲這樣可以更輕鬆地處理錯誤。

+0

我知道構造函數沒有返回值,在我的情況下(通過文件路徑加載文件)它可能是一個嚴重的問題,但儘管如此,使用構造函數而不是公共方法更舒服...我也couldn不記得我是否見過帶有「額外」參數的構造函數,並認爲它是不成文規則之類的東西......這就是爲什麼我問。謝謝 –

+0

是的,我知道如果你能讓構造函數在一開始就完成初始化工作,你可以編寫更直接的代碼。但是當你的構造函數發現「c:documentsimages^Hackground.png」不是一個有效的文件名時,你的計劃是什麼? – sh1