1

Vector3D クラスを設計していますが、デカルト基底ベクトルやオリゴなど、よく使用されるベクトルに簡単にアクセスしたいと考えています。以下は、静的メンバーを使用するアプローチです。これはこれを達成する正しい方法ですか?パフォーマンスが重要なポイントになります。

vector.h

#include <iostream>

class Vector3D {

public:
    Vector3D(double x=0.0, double y=0.0, double z=0.0) :
        x_(x),
        y_(y),
        z_(z) {};

    inline void print() const {
        std::cout << x_ << " " << y_ << " " << z_ << std::endl;
    }

    // Predefined Vectors
    static Vector3D ZERO;
    static Vector3D X;
    static Vector3D Y;
    static Vector3D Z;

    double x_, y_, z_;
};

ベクトル.cpp

#include "vector.h"

// Predefined vectors
Vector3D Vector3D::ZERO = Vector3D(0.0f, 0.0f, 0.0f);
Vector3D Vector3D::X    = Vector3D(1.0f, 0.0f, 0.0f);
Vector3D Vector3D::Y    = Vector3D(0.0f, 1.0f, 0.0f);
Vector3D Vector3D::Z    = Vector3D(0.0f, 0.0f, 1.0f);

クラスは次のように使用できます。

main.cpp

#include "vector.h"

int main()
{
    Vector3D o = Vector3D::ZERO;
    Vector3D x = Vector3D::X;
    Vector3D y = Vector3D::Y;
    Vector3D z = Vector3D::Z;

    o.print();
    x.print();
    y.print();
    z.print();

    return 0;
}
4

3 に答える 3

1

const識別子がありません。誰かが誤って ZERO を変更したくない =)

また、静的メソッドを使用することもできます:

struct Vector3D
{
  //...

  static Vector3D const & ZERO()
  {
     static Vector3D zero_(0,0,0);
     return zero_;
  }
};
于 2013-04-01T07:43:00.093 に答える
1

可能な限り const を使用してください - Scott Meyers

  あなたのコードは問題なく、さらに使用できますconst

class Vector3D
{
    // ...
    static const Vector3D ZERO;
    static const Vector3D X;
    static const Vector3D Y;
    static const Vector3D Z;
};

const Vector3D Vector3D::ZERO = Vector3D(0.0f, 0.0f, 0.0f);
const Vector3D Vector3D::X    = Vector3D(1.0f, 0.0f, 0.0f);
const Vector3D Vector3D::Y    = Vector3D(0.0f, 1.0f, 0.0f);
const Vector3D Vector3D::Z    = Vector3D(0.0f, 0.0f, 1.0f);

(よくわかりません)constキーワードは、コンパイラーがより良い最適化を行うのに役立ちます。

于 2013-04-01T07:43:54.273 に答える
0

main 関数の最初の 4 行は、静的メンバ ベクトルのアドレスが割り当てられるポインタである必要があります。

参照: http://www.learncpp.com/cpp-tutorial/811-static-member-variables/ 「クラスのメンバー変数は、static キーワードを使用して静的にすることができます。静的メンバー変数は、プログラムに関係なく一度だけ存在します。定義されているクラス オブジェクトの数! それについて考える 1 つの方法は、クラスのすべてのオブジェクトが静的変数を共有することです。"

クラス/ファイルの名前を変更することをお勧めします。vector は標準ライブラリ テンプレート クラスです。

于 2013-04-01T07:43:26.363 に答える