2016-03-01 14 views
1

比方說,我有一個代表一個人的一類:C++:在顯示一些數據避免干將

class Person { 
    string name; 
    int age; 
} 

我想用類Printer

class Printer { 
public: 
    void print(string toPrint) { cout << toPrint << endl; } 
} 

哪個顯示約​​人在屏幕上的信息以下方法是更好的做法:

  1. 將吸氣劑添加到Person,然後打電話給他們從外部(例如main法):

  2. 要干將添加到Person但(通過重載print法)從Printer叫他們

    printerInstance.print(personInstance); 
    // ... 
    Printer::print(Person person) { 
        print(person.getName + ", " + person.getAge); 
    } 
    
  3. 爲了使Person取決於Printer(我們正在避免getter)並致電:

    personInstance.print(printerInstance); 
    // ... 
    Person::print(Printer printer) 
    { 
        printer.print(getName + ", " + getAge); 
    } 
    
+0

一個抽象層次超出你的實際問題:重載的<< <<操作符不會是解決這個問題的更「慣用」的方式嗎? – Marco13

+0

@ Marco13如果顯示數據爲「cout」的限制 - 是的。但在我的問題中,這僅僅是一個例子,我想找到的答案不僅適用於在控制檯中打印,而且也適用於在GUI中顯示數據。 –

+1

然後又一個(第4個)選項(來自Java傢伙;-)):您可能會考慮提供一個'toString'方法(或者,如果您願意:'to_string'),它只會返回對象的「合理」字符串表示,而不會明確暴露課程的內部細節。 – Marco13

回答

2

我通常按照Scott Meyer的建議,「非會員非朋友功能更喜歡會員功能」。

他說,更高層次的封裝是當最少數量的函數訪問類的私有成員時,這聽起來像一個合理的定義。

所以在我看來,解決方案2是你提出的最好的(但我傾向於operator<<)。

但是,一個重要的注意事項是:如果您必須爲打印機提供的數據(通過getter)是不會暴露的,那麼您就不能忍受這種情況了。封裝的想法是保護你的內部,以便將來可以改變你的實現。如果你只是爲了打印機而暴露你的內部部件,你就冒着使用你的獲取者的風險,並且以後不能刪除它們。在這種情況下,toStringtoStream方法似乎更好。

如果您確信將來你會永遠擁有,即使你停止使用getAgegetName方法int agestd::string name內部(例如計算從生日年齡),那麼它的罰款。

+0

最後兩段對我的問題至關重要 - 我想避免暴露'Person'的內部。因此,我不相信1.和2.這個問題的方法。另一方面,3的缺點是'Person'依賴於'Printer'。 –

+0

然後我會建議'toStream'方法,它可以被一個非朋友的非成員'operator <<'調用,以方便使用。 –