如何制作一个好的set/get方法

mar*_*m91 3 c++

例如,我们有这个类:

class Coord
{
  double x;
  double y;
  double z;

public:
  Coord() { x = y = z = 0; }

  void set(double xx, double yy, double zz)
  {
    x = xx;
    y = yy;
    z = zz;
  }

  void set_x(double xx) { x = xx; }
  void set_y(double yy) { y = yy; }
  void set_z(double zz) { z = zz; }

  double get_x() { return x; }
  double get_y() { return y; }
  double get_z() { return z; }
};
Run Code Online (Sandbox Code Playgroud)

在这7种方法中,我们可以设置并获得坐标的x,y和z.我很感兴趣,产生更少的方法set(),并get()在那里我可以调用类似的东西:

int main()
{
  Coord c;

  c.set_x(5); /* only set x */
  c.set_y(6); /* or y */
  c.set_z(7); /* or z */
  c.set(1,2,5); /* or setting x, y and z */

  c.get_x(); /* only get x */
  c.get_y(); /* or y */
  c.get_z(); /* or z */
}
Run Code Online (Sandbox Code Playgroud)

man*_*lio 6

如果Coord课程那么简单,它也可能是一个struct.

无论如何你可以写一些像:

class Coord
{
public:
  enum xyz {x = 0, y, z};

  Coord() : vec{x, y, z} {}

  template<xyz C> void set(double v) { vec[C] = v; }
  template<xyz C> double get() const { return vec[C]; }

  void set(double xx, double yy, double zz)
  {
    set<Coord::x>(xx);
    set<Coord::y>(yy);
    set<Coord::z>(zz);
  }

private:
  double vec[z + 1];
};
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用类:

Coord c;

c.set<Coord::x>(5); /* only set x */
c.set<Coord::y>(6); /* or y */
c.set<Coord::z>(7); /* or z */
c.set(1,2,5); /* or setting x, y and z */

c.get<Coord::x>(); /* only get x */
c.get<Coord::y>(); /* or y */
c.get<Coord::z>(); /* or z */
Run Code Online (Sandbox Code Playgroud)