4

在任何人说任何话之前,我知道这可能不被推荐,但我仍然很好奇是否有更好的方法来做这件事,或者有理由不去做,这只是一件奇怪的事情。

我开始研究这个,因为我想直接使用类中语义命名的成员访问数组的元素,同时仍然能够迭代数组,而不必调用/创建一些 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]) 

我想我在尝试之前遇到了一些其他问题。那好吧。

4

3 回答 3

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];
};
于 2013-03-19T23:20:32.343 回答
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可能,这个变体更好(与其他替代方案相比),因为它需要更少的代码,并为您提供了以数组样式进行迭代的额外能力。

于 2013-03-19T23:20:18.353 回答
2

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

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

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

然后你可以只使用VectorUnion你的 Vertex 类内部或单独使用......

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

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

于 2013-03-19T23:30:24.523 回答