有没有更好的方法来初始化引用成员以引用同一个类中的另一个成员

时间:2013-03-19 23:14:44

标签: c++ class reference constructor const-cast

在任何人说出任何事情之前,我知道这可能不推荐,但我仍然很好奇,如果有更好的方法可以做到这一点或者理由不仅仅是因为这是一件奇怪的事情。

我开始研究这个因为我想在类中使用语义命名的成员直接访问数组的元素,同时仍然可以迭代数组而不必调用/创建一些getter或setter方法。

我有一个看起来像这样的类定义。

class Vertex{
    public:
    Vertex(float x,float y,float z,float w);
    float v[4];
    float &x,&y,&Z,&w;
};

一个看起来像这样的构造函数。我的问题是。有没有更好的方法来做我在构造函数中做的事情?

Vertex::Vertex(float vx,float vy,float vz,float vw):
    x(*const_cast<float*>( &this->v[0] )),
    y(*const_cast<float*>( &this->v[1] )), 
    z(*const_cast<float*>( &this->v[2] )),
    w(*const_cast<float*>( &this->v[3] ))
{
    v[0]=vx;
    v[1]=vy;
    v[2]=vz;
    v[3]=vw;
}

修改

我是个白痴......你可以像Jonathan Wakely所说的那样做。

x(v[0]) 

我想在尝试之前我还有其他一些问题。哦,好吧。

3 个答案:

答案 0 :(得分:7)

Vertex::Vertex(float vx,float vy,float vz,float vw):
    v { vx, vy, vz, vw },
    x(v[0]),
    y(v[1]), 
    z(v[2]),
    w(v[3])
{
}

我在这里避免写参考成员。原因是引用成员阻止了默认(编译器生成的)复制/赋值特殊成员。

class Vertex{
  public:
    Vertex(float x,float y,float z,float w)
        : v { x, y, z, w } { }

    float &x() { return v[0]; }
    float &y() { return v[1]; }
    float &z() { return v[2]; }
    float &w() { return v[3]; }

    float const &x() const { return v[0]; }
    float const &y() const { return v[1]; }
    float const &z() const { return v[2]; }
    float const &w() const { return v[3]; }
  private:
    float v[4];
};

答案 1 :(得分:4)

你也可以这样:

class Vertex
{
public:
  float x;
  float y;
  float z;
  float w;

  Vertex(float x, float y, float z, float w);

  float&
  operator[](int i)
  { return *(&x + i); }

  float
  operator[](int i) const
  { return *(&x + i); }
};

可能这个变体更好(与其他替代方案相比),因为它需要更少的代码,并且为您提供了以数组样式迭代Vertex的额外功能。

答案 2 :(得分:2)

就个人而言,我最喜欢@ sehe的答案,但我会给你一个替代方案。

struct Vector4 {
    float x;
    float y;
    float z;
    float w;
};

union VectorUnion {
    Vector4 vector;
    float array[4];
};

然后你可以使用Vertex类中的VectorUnion或单独使用...

我担心这是一个C构造,而C ++结构略有不同(它包括vtable等),但我认为它应该可以工作。

同样,我认为@ sehe的答案更好。