0

我有一个存储 x、y、z 值的类“向量”。我有一个类',它有多个'Vector'对象。

Camera::Camera(Vector Pos, Vector LookAt, Vector UpDir)
{
}
Camera Cam(Vector(3,3,3), Vector(0,0,0), Vector(0,0,0));

有时我不想通过 Vector(0,0,0),我更愿意通过 NULL 并测试 LookAt/UpDir == NULL 与否,但 NULL 不想在这种情况下工作。我应该怎么办?

希望这是有道理的

4

4 回答 4

2

定义一个名为 null 的静态成员。

class Camera {
  static Vector Null;
}

Vector Null(0,0,0);

然后在需要比较时使用它。

if(my_vector == Camera::Null){
}

如果发现这始终是最惯用的方法。

于 2013-04-20T17:30:02.163 回答
1

您可以为 Vector 定义一个默认构造函数,并为 Vector 提供知道它为空的能力。如果空 Vector 的条件从包含三个零变为另一个数字或完全不同的东西,那么您可以修改 empty() 函数来处理这些条件,而无需修改 Camera。

Camera::Camera(Vector Pos, Vector LookAt, Vector UpDir)
{
  if(LookAt.empty()) 
  { 
    //do something; 
  }
}

Camera Cam(Vector(3,3,3), Vector(), Vector());

Camera 的静态成员初始化为三个零的一个问题是它会引入其他类的依赖项,这些类也需要检查 Vector 是否为 NULL。他们需要包含 Camera 头文件才能访问声明。对我来说,它使 Vector 依赖于 Camera 来定义 NULL 标准,而不是我认为可能难以维护的其他方式。

在阅读了 Michael Feathers 在有效地使用遗留代码中的依赖破坏技术之后,我受到启发来写这篇文章。

于 2013-04-21T00:47:58.223 回答
0

如果您的Vector对象可能具有无效状态,则可以使用以下方法:

class Vector
{
public:
   int x, y, z;
   bool valid;

   Vector() : x(0), y(0), z(0), valid(false) {}
   Vector(int x, int y, int z) : x(x), y(y), z(z), valid(true) {}
};

然后你的Camera课:

class Camera
{
public:
    Camera(const Vector &pos, const Vector &lookAt, const Vector &upDir)
    {
        if (!lookAt.valid) {...}
    }
};

用法:

Camera c(Vector(1,2,3), Vector(), Vector());

您可以为默认值定义一个静态实例:

class Vector
{
public:
    static Vector INVALID;
private: Vector(); // make invalid constructor private
};

Vector Vector::IVALID;

用法:

Camera c(Vector(123), Vector::INVALID, Vector(12,4,5));
于 2013-04-21T00:58:38.160 回答
0

如果可能,将您的界面更改为矢量指针。

Camera::Camera(Vector *Pos, Vector *LookAt, Vector *UpDir)
{
}

并用你的向量地址调用它;

Camera Cam(&v1, &v2, NULL);
于 2013-04-20T17:33:30.413 回答