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

C++ 在这种情况下如何使用NULL?,c++,vector,C++,Vector,我有一个类“Vector”,它存储x,y,z值。我有一个类,它有多个向量对象 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或not,但NULL不想在这种情况下工作。 我该怎么办 希望这有意义定义一个名为n

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

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或not,但NULL不想在这种情况下工作。 我该怎么办


希望这有意义

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

class Camera {
  static Vector Null;
}

Vector Null(0,0,0);
然后在需要比较时使用它

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

如果您发现这总是最惯用的方法。

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

class Camera {
  static Vector Null;
}

Vector Null(0,0,0);
然后在需要比较时使用它

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

如果可能,请将界面更改为向量指针

Camera::Camera(Vector *Pos, Vector *LookAt, Vector *UpDir)
{
}
用向量的地址来称呼它

Camera Cam(&v1, &v2, NULL);

如果可能,将接口更改为向量指针

Camera::Camera(Vector *Pos, Vector *LookAt, Vector *UpDir)
{
}
用向量的地址来称呼它

Camera Cam(&v1, &v2, NULL);

您可以为Vector定义一个默认构造函数,并提供让Vector知道它是空的功能。如果空向量的条件从包含三个零变为另一个数字或完全不同的数字,则可以修改empty()函数来处理这些条件,而无需修改摄影机

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

Camera Cam(Vector(3,3,3), Vector(), Vector());
初始化为三个零的Camera静态成员的一个问题是,它将引入其他类,这些类也需要检查向量是否为NULL。他们需要包含摄像头头文件才能访问声明。对我来说,它使矢量依赖于相机来定义空标准,而不是我认为可能难以维持的另一种方式


在阅读了Michael Feathers关于如何有效地使用遗留代码来打破依赖性的技术之后,我受到了写这篇文章的启发

您可以为Vector定义一个默认构造函数,并提供让Vector知道它是空的功能。如果空向量的条件从包含三个零变为另一个数字或完全不同的数字,则可以修改empty()函数来处理这些条件,而无需修改摄影机

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

Camera Cam(Vector(3,3,3), Vector(), Vector());
初始化为三个零的Camera静态成员的一个问题是,它将引入其他类,这些类也需要检查向量是否为NULL。他们需要包含摄像头头文件才能访问声明。对我来说,它使矢量依赖于相机来定义空标准,而不是我认为可能难以维持的另一种方式


在阅读了Michael Feathers关于如何有效地使用遗留代码来打破依赖性的技术之后,我受到了写这篇文章的启发

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

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) {}
};
然后你的
相机
课程:

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

Camera c(Vector(1,2,3), Vector(), Vector());
Camera c(Vector(123), Vector::INVALID, Vector(12,4,5));
可以为默认值定义静态实例:

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

Vector Vector::IVALID;
用法:

Camera c(Vector(1,2,3), Vector(), Vector());
Camera c(Vector(123), Vector::INVALID, Vector(12,4,5));

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

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) {}
};
然后你的
相机
课程:

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

Camera c(Vector(1,2,3), Vector(), Vector());
Camera c(Vector(123), Vector::INVALID, Vector(12,4,5));
可以为默认值定义静态实例:

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

Vector Vector::IVALID;
用法:

Camera c(Vector(1,2,3), Vector(), Vector());
Camera c(Vector(123), Vector::INVALID, Vector(12,4,5));

请格式化您的帖子。为参数提供默认值,这样您就不必记住显式传递(0,0,0)。动机是什么?你想节省一些打字时间吗?你是否担心清晰度?你是否关心性能?你真的想拥有NULL或类似Null向量的东西吗?注意:<代码> null <代码>不是“适当”的C++,而是使用C. <代码> NulLPTR < /C> >(或者,如果代码太旧,没有代码> NulLPTR < /代码>,则使用<代码> 0 。请格式化您的帖子。为参数提供默认值,这样您就不必记住显式传递(0,0,0)。动机是什么?你想节省一些打字时间吗?你是否担心清晰度?你是否关心性能?你真的想有空或类似Null向量的东西可以吗?注意:<代码> null <代码>不是“适当”的C++,而是使用C <代码> NulLPTR < /C> >(或者,如果代码太旧,没有代码> NulLPTR < /代码>),那应该是代码>静态向量null;
正常
或除
以外的任何内容,因为这对编程人员有特定的含义。这可能是
静态向量空
正常
或除
以外的任何内容,因为这对编程人员有特定的含义。不要这样做。现在我们需要开始担心所有权问题。这会导致各种各样的问题,尤其是初学者。在您理解所有权概念之前,请坚持使用值而不是指针(指针应封装在智能指针中,以控制寿命并指定所有权语义)。这不是C,首先假设你有这些向量的地址。即问题中的首选格式(
摄像机摄像机(矢量(3,3,3),空,空)
因为无法获取第一个临时文件的地址而中断。不要这样做。现在我们需要开始担心所有权。这会导致各种问题,特别是对于初学者。在理解所有权概念之前,请非常坚定地坚持价值观而不是指针(指针应包装在智能指针中,以控制寿命并指定所有权语义)。这不是C。首先假设您拥有这些向量的地址。即问题中的首选格式(
Camera Cam(Vector(3,3,3),NULL,NULL)
中断,因为您无法获取第一个临时变量的地址。