4

誰かが何かを言う前に、これはおそらく推奨されないことを知っていますが、それを行うためのより良い方法や、奇妙なことを超えない理由があるかどうかはまだ興味があります.

クラス内の意味的に名前が付けられたメンバーを使用して配列の要素に直接アクセスしたいが、配列を反復処理でき、ゲッターまたはセッターメソッドを呼び出し/作成する必要がないため、これを調べ始めました。

このようなクラス定義があります。

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;
}

編集

私はばかです... ジョナサン・ウェイクリーが言ったようにすればいいのです。

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 に答える