1

我正在设计一个 Vector3D 类,并希望能够轻松访问一些常用向量,例如笛卡尔基向量和 origo。下面是一种使用静态成员的方法。这是实现这一目标的正确方法吗?性能将是一个关键点。

矢量.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);

然后可以像这样使用该类:

主文件

#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标识符。你不希望有人不小心修改零 =)

您也可以使用静态方法:

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

主函数的前四行应该是分配静态成员向量地址的指针。

见: http: //www.learncpp.com/cpp-tutorial/811-static-member-variables/ “一个类的成员变量可以使用static关键字变成静态的。静态成员变量在程序中只存在一次,无论如何定义了多少类对象!考虑它的一种方法是类的所有对象共享静态变量。

您可能想要更改类/文件的名称,vector 是标准库模板类。

于 2013-04-01T07:43:26.363 回答