公共全局变量或get()和set()方法?

时间:2015-05-13 09:13:02

标签: c++

在其他类中访问和修改特定类的变量的更好方法是什么?使用公共全局变量或使用get()和set()?

3 个答案:

答案 0 :(得分:3)

尝试使用您的界面提供与您的班级相关联的任何逻辑,而不是公共成员或专用的setter和getter方法。

即。向量的长度在逻辑上链接到向量本身,因此您不希望为程序的其余部分提供任何直接或间接访问数据的工具,但提供长度作为接口的一部分。

示例getter:

class v2d
{
  double mx, my;
public:
  double get_x() const { return mx; }
  double get_y() const { return my; }
};

bool foo (v2d const &v)
{
  using std::sqrt;
  return sqrt(v.get_x()*v.get_x() + v.get_y()*v.get_y()) > 1.0;
}

示例长度界面:

class v2d
{
  double mx, my;
public:
  double len () const
  {
    using std::sqrt;
    return sqrt(mx*mx + my*my);
  }
};

void foo (v2d const &v)
{
  return v.len() > 1.0;
}

使用秒,你可以自由更改数据成员(即用double m[2];替换两个......)。

同样适用于setter:提供类更改逻辑作为有意义的接口的一部分。

示例getter和setter:

class v2d
{
  double mx, my;
public:
  void set_x(double new_x) { mx = new_x; }
  void set_y(double new_y) { my = new_y; }
  double get_x() const { return mx; }
  double get_y() const { return my; }
};

void normalize (v2d &v)
{
  using std::sqrt;
  double const len = sqrt(v.get_x()*v.get_x() + v.get_y()*v.get_y());
  v.set_x(v.get_x()/len);
  v.set_y(v.get_y()/len);
}

示例有意义的界面:

class v2d
{
  double mx, my;
public:
  double len () const
  {
    using std::sqrt;
    return sqrt(mx*mx + my*my);
  }
  v2d& operator/= (double const factor)
  {
    mx /= factor;
    my /= factor;
    return *this;
  }
};

void normalize (v2d &v)
{
  v /= v.len();
}

答案 1 :(得分:0)

如果你真的很懒,那就公开一下。

如果您希望代码可维护,请使用获取设置

答案 2 :(得分:0)

公共数据成员不是你的控制者。您或您的代码的用户可以从任何地方访问它们,因此您无法更改它们。

简单示例 - 如果要更改全局变量的数据类型,则必须在访问它的任何位置更改代码。如果您有setter和getter,只需添加转换即可。

使用setter和getter,您可以添加检查输入或输出是否有效且安全。