2015-10-06 132 views
1

我是一名編程初學者,我正在使用本書學習C++編程語言:編程原理和使用C++的實踐。今天我來到這裏是因爲我需要幫助解決技術問題。在第9章中,我必須編寫這個實現Book類的程序,例如我們可以將其想象成庫軟件的一部分。我們的圖書班將有4個成員:一個ISBN(用n-n-n-x表示,其中n是一個整數,x是一個字母或數字),作者姓名,書名,版權日期。如何處理構造函數的參數過多?

我剛開始使用類,所以我仍然在學習程序員在編寫代碼時應該怎麼做,因爲這個類我不認爲我們可以提供任何默認構造函數,因爲沒有默認值給一本書。所以,在決定有4個參數的書構造我們會somenthing這樣的:

class Book { 
public: 
Book(string, string, string, Date); 
private: 
string isbn; 
string author; 
string title; 
Date copyright_date; // I defined the Date class in a previous exercise 
}; 

寫這本書的類我覺得現在的這個簡短的skecth之後的書類的構造函數可以是一個問題,這是因爲它需要4個參數,可以使初始化列表很長:

Book b1{ "1,2,3,h", "Stroustrup", "Programming principles and practice using C++", {2015,Month::jan, 1} }; 

你覺得這個初始化一書的太長?如果我想創建一個圖書矢量怎麼辦?你將如何解決這個問題?請記住,我不是專家,所以我仍然無法理解關於課程和他們設計的所有內容,但這只是一個嘗試提高我的技能並更好地瞭解課程的問題。

+3

在「現實世界」中,這本書的列表將來自外部來源,所以這不是一個真正的問題。無論如何,這個問題沒有答案。 –

回答

2

既然你是一個學習者,我會給你一些你沒有特別提出的建議。

首先。永遠不要做using namespace std;。有一個原因是爲什麼命名空間std被放置到位,這不是爲了讓你在每個文件的開頭輸入這些魔術字。這是爲了避免名稱衝突。有了這個習慣,你很快就會遇到一個非常令人費解的編譯錯誤,那就是在std命名空間中會有一個名字,而你自己的命名空間或者其他命名空間也會以同樣的方式出現。長話短說,不要這樣做:)。

二。在函數原型中給出你的參數名稱。 Book(string, string, string, Date);應該是Book(std::string isbn, std::string author...;。這將幫助您(或其他代碼維護者)在不查找它的實現的情況下查看函數期望的內容。

三。字符串參數。按價值或參考傳遞?關於這件事我們可以說很多,就在上週,我真的因爲說出了一些我相信的話而被人嘲笑,我建議你稍後再深入研究,這很重要,並且定義了你的編程習慣。現在你只需要瞭解當你按照價值傳遞字符串時真正發生的事情,就像你一樣。

四,不,它不長:)(你的參數列表)。爲了增強可讀性,將其分成幾行。拆分的方法是純主觀的,以人的審美觀,我個人比較喜歡這種形式:

Book b1{ "1,2,3,h", "Stroustrup", 
     "Programming principles and practice using C++", 
     {2015,Month::jan, 1} 
     }; 
+0

可以使用類似'使用std :: string;'的東西嗎? – Bateman

+0

@KhanZaid看到這個:http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice – NathanOliver

+0

@NathanOliver提供了一個全面的鏈接:) std ::是5個字符。使其成爲您的自動手勢來輸入它。 – SergeyA

-3

其實你是把你的類,這是voilating單一職責原則多重責任。聽起來不太熟悉,對嗎?

它應該是。作爲初學者,很高興您正在學習OOP的一些基礎知識。你也關心你的代碼的可維護性。我會建議先學習OOP的所有功能,並學習如何在代碼中實現它們。當你以爲你是好走,學習以下主題:

  1. 代碼重構
  2. 碼味
  3. 分離關注的
  4. SOLID原則

慢慢來,不着急。當你認爲自己有豐富的知識並且可以編寫上述主題時,就可以開始學習設計模式。

這個話題不能用一個鏡頭來掌握。它需要許多練習,失敗,試錯法。

+1

這個班級有多重責任?如所給出的,除了擁有一本書的屬性外,它什麼也不做。 – interjay

+0

屬性的名稱表明設置這些屬性可能已由Service類解釋。通常,類的每個函數中使用的屬性都由構造函數初始化。 –

+1

什麼一堆無關短語。 – SergeyA