在这种情况下如何使用NULL?

时间:2013-04-20 17:26:12

标签: c++ vector

我有一个'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不想在这种情况下工作。 我该怎么办?

希望这是有道理的

4 个答案:

答案 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));
相关问题