我应该在课堂上使用setter / getters吗?

时间:2017-03-06 20:10:48

标签: c++ oop encapsulation getter-setter

  

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

是正确的

2 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:2)

直接引用自己类中的变量是完全正确的。

访问器/ mutator的想法是使用类外部数据的函数不应该对它的存储方式做任何假设。

显然,类本身知道数据是如何存储的,因此可以直接操作它。