我有一个'Vector'类,它存储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不想在这种情况下工作。 我该怎么办?
希望这是有道理的
答案 0 :(得分:2)
定义名为null的静态成员。
class Camera {
static Vector Null;
}
Vector Null(0,0,0);
然后在需要比较时使用它。
if(my_vector == Camera::Null){
}
如果发现这始终是最惯用的方法。
答案 1 :(得分: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的“有效使用遗留代码”中的依赖性破解技术后,我受到启发。
答案 2 :(得分:0)
如果可能,将界面更改为矢量指针。
Camera::Camera(Vector *Pos, Vector *LookAt, Vector *UpDir)
{
}
并用你的矢量地址调用它;
Camera Cam(&v1, &v2, NULL);
答案 3 :(得分: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));