我如何构建这种类的接口

时间:2013-05-14 09:51:42

标签: c++

我有兴趣尝试创建自定义类型,然后使用点语义访问其成员。例如:

 Class A{ //simplified, omitting constructors and other methods
   private:
   float numbers[3];
   public:
   float x(){ return numbers[0]; }
   float y(){ return numbers[1]; }
   float z(){ return numbers[2]; }
  }

所以我可以这样做:

  A a;
  //do stuff to populate `numbers`

  float x=a.x;

但我还想在numbers左右开始制作元素,这样我就能做到这样的事情:

  A a;
  a.y=5; //assigns 5 to numbers[1]

如何进行此设置方法?

3 个答案:

答案 0 :(得分:1)

首先。你创建了函数 x,y和z,但是将它们分配给float。这不行。 第二。更改这些功能以返回参考:

class A{ //simplified, omitting constructors and other methods
   private:
   float numbers[3];
   public:
   float & x(){ return numbers[0]; }
   float & y(){ return numbers[1]; }
   float & z(){ return numbers[2]; }
};
...
A point;
float x = point.x();
point.x() = 42.0f;

还有另一种方法:将引用声明为类的成员并在c-tor中初始化它们:

class A{ //simplified, omitting constructors and other methods
   private:
   float numbers[3];
   public:
   float & x;
   float & y;
   float & z;
   A() : x( numbers[ 0 ] ), y( numbers[ 1 ] ), z( numbers[ 2 ] ) {}
};
...
A point;
float x = point.x;
point.x = 42.0f;

P.S。注意评论,这给了@MikeSeymour

答案 1 :(得分:1)

您可以返回允许分配的引用:

float & x(){ return numbers[0]; }
      ^

// usage
A a;
a.x() = 42;

您还应该有const重载,以允许对const对象进行只读访问:

float x() const {return numbers[0];}
          ^^^^^

// usage
A const a = something();
float x = a.x();

答案 2 :(得分:0)

除非您实际拥有名为x,y和z的公共变量。

或者您可以返回参考,然后执行a.y() = 5