C++ 在这种情况下如何使用NULL?
我有一个类“Vector”,它存储x,y,z值。我有一个类,它有多个向量对象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
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)
中断,因为您无法获取第一个临时变量的地址。