2016-01-20 58 views
1

你有什麼事,我應該在方法中使用cout <<?或者我應該返回一個數組?因爲我需要更多的回報valueC++方法很好的編程風格cout

我有類SGetraenkeAutomat,這裏是SGetraenkeAutomat.cpp

void SGetraenkeAutomat::DisplayInventory(){ 
    std::cout << m_nColaAnzahl; 
    std::cout << m_nSpriteAnzahl; 
    std::cout << m_nFantaAnzahl; 
} 

.h文件

class SGetraenkeAutomat 
{ 
    public: 
     // this method 
     void DisplayInventory(); 

     SGetraenkeAutomat(); 
     SGetraenkeAutomat(int nColaAnzahl, int nSpriteAnzahl, int nFantaAnzahl); 
     virtual ~SGetraenkeAutomat(); 
    private: 
     int m_nColaAnzahl; 
     int m_nSpriteAnzhal; 
     int m_nFantaAnzahl; 
}; 

方法void SGetraenkeAutomat::DisplayInventory()那是一個良好的編程風格?

- >我不這麼認爲,但也許有人可以解釋一下我。

+3

通常它最好有一個類似toString()方法的東西,它可以創建一個字符串化對象表示,然後將其打印到您喜歡的任何流中。或者像下一個評論者所建議的那樣返回結構體。取決於你想要做什麼 –

+2

該方法稱爲「顯示...」,所以我期望它使用cout或gui。如果它返回數組中的庫存,它將被稱爲'Get ...'。你有什麼是自洽的 – Eric

+0

@KaiIskratsch感謝您的評論。你能給我一個小例子嗎? – MyNewName

回答

2

我寧願它重命名爲PrintInventory並提供一個可選的參數:

void PrintInventory(std::ostream &output = std::cout); 

這種方式,您可以輸出您的庫存,一些其他的數據流,並在同一時間,你不必指定它的每個你想打印到標準輸出的時間。

void SGetraenkeAutomat::PrintInventory(std::ostream &output){ 
    output << m_nColaAnzahl; 
    output << m_nSpriteAnzahl; 
    output << m_nFantaAnzahl; 
} 

這樣您可以執行:

automat.PrintInventory(); // prints to stdout 

或類似

automat.PrintInventory(std::cerr); // prints to stderr, for example 
+0

感謝您的回答!我將這個函數原型添加到我的'* .h'文件中。我如何顯示庫存? – MyNewName

+1

@我的名字,你是什麼意思?就像你之前做的一樣。只有現在,如果你想這樣做,你還有一個選擇可以通過另一個論點。 –

+0

感謝您的編輯!現在我懂了。非常感謝。 – MyNewName

1

或者我應該返回一個數組?

不是。該班有3 private成員,最好不要暴露在外,這樣會導致大多數情況下緊密耦合。

我應該在方法中使用cout < <?

如果統計請求,應該沒問題。

+0

我應該讓他們公開嗎?因爲我想顯示廣告資源。 – MyNewName

+1

@MyNewName最好是製作一個公開的成員方法來顯示庫存,將它們全部封裝在類中。 – songyuanyao

1

在這種情況下,因爲該方法被稱爲DisplayInventory,人們不會想到它返回任何東西,但實際上以某種方式向用戶顯示庫存。這與Tell, Don't Ask「規則」一致,該規則說你應該告訴你的物體做什麼,而不是問他們關於他們狀態的問題。

在一個簡單的應用程序中,使用cout與用戶進行交互是完全可以接受的;另一種選擇是使用GUI來顯示信息。

你也可以看看這樣說:顯示庫存到標準輸出,你必須使用cout地方。 (在我看來)將它封裝在一個類方法中比將所有數據暴露給getter(因此打破「tell,do not ask」)並將它打印到課堂外更好。

如果你想得到更多的花式並獲得可定製的輸出,你可以創建一些格式化類並將它傳遞給顯示函數(謝爾蓋的答案是這個原理的變體)。

1

答案取決於你的任務。如果您需要顯示變量而不是使用某個流來顯示。如果程序中的其他類需要SGetraenkeAutomat類的數據,則應該爲每個私有成員提供公共獲得者。對於前:

int get_ColaAnzahl() 
{ 
return m_nColaAnzahl; 
} 

正如我可以在你的情況下,看到的將是更好地創造一些基礎類(允許其命名爲飲料):

struct Drink { 
int count; 
std::string name; 
} 

然後修改SGetraenkeAutomat類:

class SGetraenkeAutomat 
{ 
    public: 
     // this method 
     void DisplayInventory() { 
      for (auto drink: drinks) { 
       std::cout << drink.name << ": " << drink.count << std::endl; 
      } 
     } 

     void addDrink(const Drink& drink) { 
      drinks.push_back(drink); 
     }; 
     SGetraenkeAutomat(); 
     virtual ~SGetraenkeAutomat(); 
    private: 
     std::vector<Drink> drinks; 
}; 

我想你明白我上面描述的想法。

+0

感謝您的回答!我喜歡這個想法。結構'Drink',它是一個自己的類(Drink.h&Drink.cpp)?當我想填補一個特定的飲料時,我必須遍歷整個矢量? – MyNewName

+0

@MyNewName向量就是例子,當然你可以使用std :: map 或者std :: unordered_map 其中key是name,value是count。或其他收集,取決於你的任務。在地圖的情況下,您不需要創建struct Drink,直到飲料的參數不會增長(此時您只有一個飲料參數:count),那麼地圖的值將是包含所有飲料參數的struct。它看起來像這個std :: map 。 –

+1

好的。感謝您的回答!我會像你說的那樣去做。 – MyNewName