1

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

 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]

我该如何做这种设置方法?

4

3 回答 3

1

第一的。您创建了函数x、y 和 z,但将它们分配给浮点数。这是行不通的。第二。更改这些函数以返回引用:

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;

PS注意评论,这给了@MikeSeymour

于 2013-05-14T09:56:05.907 回答
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();
于 2013-05-14T10:06:23.797 回答
0

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

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

于 2013-05-14T09:54:37.423 回答