C++ Can';我不能用构造函数发送NULL作为参数吗?

C++ Can';我不能用构造函数发送NULL作为参数吗?,c++,C++,假设我有一个Shape对象,它的构造函数如下: Shape( width, height, radius, depth ) Shape myrect(50, 50); // Calls second constructor. 现在,我只有一个愚蠢的矩形,所以我不需要半径和深度。。。可以吗 Shape myRect(50, 50, NULL, NULL) ? 我知道这不是最好的主意,我应该使用继承和其他东西,但这是我所处的混乱状态,所以我可以像这样使用NULL吗 我可以这样使用NULL吗 否

假设我有一个Shape对象,它的构造函数如下:

Shape( width, height, radius, depth )
Shape myrect(50, 50); // Calls second constructor.
现在,我只有一个愚蠢的矩形,所以我不需要半径和深度。。。可以吗

Shape myRect(50, 50, NULL, NULL) ?
我知道这不是最好的主意,我应该使用继承和其他东西,但这是我所处的混乱状态,所以我可以像这样使用NULL吗

我可以这样使用NULL吗

否。
NULL
是指针值。事实上,代码甚至会编译(在C++中),但它只会将值
0
传递给
int
参数,而不是空指针,因为参数显然不是指针

解决方案是提供只接受两个参数的重载构造函数:

class Shape {
    // Your “normal” constructor
    Shape(int w, int h, int r, int d) {
        // …
    }

    // Overload taking only two arguments
    Shape(int w, int h) {
        // …
    }
};
这样称呼它:

Shape( width, height, radius, depth )
Shape myrect(50, 50); // Calls second constructor.
当然,正如你自己所注意到的那样,设计仍然很糟糕。一个班级不适合他们所有人

我可以这样使用NULL吗

否。
NULL
是指针值。事实上,代码甚至会编译(在C++中),但它只会将值
0
传递给
int
参数,而不是空指针,因为参数显然不是指针

解决方案是提供只接受两个参数的重载构造函数:

class Shape {
    // Your “normal” constructor
    Shape(int w, int h, int r, int d) {
        // …
    }

    // Overload taking only two arguments
    Shape(int w, int h) {
        // …
    }
};
这样称呼它:

Shape( width, height, radius, depth )
Shape myrect(50, 50); // Calls second constructor.

当然,正如你自己所注意到的那样,设计仍然很糟糕。一个类并不适合所有的类。

取决于半径和深度的类型。如果它们是整数,则必须使用像-1这样的越界值来表示“未设置”(如果这样声明,越界值也可以是0)。如果它们是指针,则可以使用NULL


实际上,您描述的是一个常见的坏继承示例,在OOP教学中使用它来说明为什么不应该继承所有内容。形状太不一样了。

取决于半径和深度的类型。如果它们是整数,则必须使用像-1这样的越界值来表示“未设置”(如果这样声明,越界值也可以是0)。如果它们是指针,则可以使用NULL

实际上,您描述的是一个常见的坏继承示例,在OOP教学中使用它来说明为什么不应该继承所有内容。形状太不一样了

我现在一团糟

有一种对付这种混乱局面的对策叫做重构

我现在一团糟


有一种对付这种混乱局面的对策叫做重构。

正如您所指出的,这不是一个好的设计。如果可以,您应该长期重新设计类层次结构:使
Shape
成为一个抽象类,并从中派生类
Rectangle
Circle
等,以及相应的构造函数。当然,公共界面将非常薄,只有像
draw
area
这样的函数。因此,另一种选择是使用模板而不是继承。正如您所指出的,这不是一个好的设计。如果可以,您应该长期重新设计类层次结构:使
Shape
成为一个抽象类,并从中派生类
Rectangle
Circle
等,以及相应的构造函数。当然,公共界面将非常薄,只有像
draw
area
这样的函数。因此,另一种选择是使用模板而不是继承。这就是我所处的混乱局面。用户定义的对象作为参数怎么样?NULL是否仍然是可用的?我不知道我是否正确理解您的评论问题。如果使用指针,可以将它们设置为NULL,作为C++语言定义。如果你使用引用,你就不走运了,因为没有有效的方法来做一个引用空(你可以做,但是只有用肮脏的技巧和失去所有C++因果报应)。再一次,我建议你尽可能地重新设计,即使你现在一团糟。这就是我所处的一团糟。用户定义的对象作为参数怎么样?NULL是否仍然是可用的?我不知道我是否正确理解您的评论问题。如果使用指针,可以将它们设置为NULL,作为C++语言定义。如果你使用引用,你就不走运了,因为没有有效的方法来做一个引用空(你可以做,但是只有用肮脏的技巧和失去所有C++因果报应)。再一次,我建议你尽可能地重新设计,即使你现在一团糟。或者给参数指定一个默认值。或者给参数指定一个默认值。