2017-03-06 36 views
1

Car.h我應該用制定者/吸氣類我讓他們

#ifndef CAR_H 
#define CAR_H 

class Car 
{ 
    public: 
     void setColor(int color); 
     void colorCarWithRandomColor(); 
    private: 
     int _color;    
}; 

#endif 

Car.cpp

#include "Car.h" 
void Car::setColor(int color){ 
    _color = color; 
} 
void Car::colorCarWithRandomColor(){ 
    // Imagine that there is a function called getRandomColor and that returns random color. 
    _color = getRandomColor(); 
    // or 
    setColor(getRandomColor()); 
    // which one is correct 
} 

因此其中哪一個是更好地使用。 _color = getRandomColor();setColor(getRandomColor());在這種情況下?我應該撥打setColor函數還是直接更改_col

+0

@user'_color'是私人 – UnholySheep

+3

他們都是有效的,可能會被編譯到完全相同的代碼。我認爲可能會讓開始將你的二傳投擲到他們宣稱的階級中感到困惑。另外'Car :: setColor'似乎沒有驗證,假設你有一個'Car :: getColor'函數,並且不會爲'Car :: setColor'添加驗證,所有setter/getters都會破壞封裝'_color'你可能根本不會打擾他們。 – Geoff

+0

@UnholySheep的確,對不起。很長一段時間 – user

回答

3

您應該更願意編寫對未來變化儘可能免疫的代碼,這通常意味着使用自己的setter(和getter)而不是直接訪問自己的私有數據。

例如,假設您決定將_color更改爲enum或RGB元組。如果您直接使用_color,則會有更多地方需要更改。使用setColor(int),您只需將一個地方從int轉換爲任何新的內部存儲。

此外,在您的特定示例中,由於setColorpublic,因此您的colorCarWithRandomColor()方法可能會成爲非成員非友方函數,這會進一步減少耦合。 (當然,這取決於你的getRandomColor()方法究竟是如何工作的。)

void colorCarWithRandomColor(Car& car) { 
    // Imagine that there is a function called getRandomColor and that returns random color. 
    car.setColor(Car::getRandomColor()); 
} 
2

直接引用自己類中的變量是完全正確的。

訪問器/增變器的想法是使用類之外的數據的函數不應該對它的存儲方式做任何假設。

顯然,類本身知道數據是如何存儲的,所以可以直接自由操作。