在 C++ 中将常规类指定为 null

Assigning general classes as null in C++

提问人:Mateus Lima Silveira 提问时间:5/20/2022 更新时间:5/20/2022 访问量:269

问:

我在将程序从 C# 调整为 C++ 时遇到了麻烦。给定一个类为其分配 null 值是非常通用的。但是 C++ 不接受等效形式“nullptr”

class Point{
     public:
         int x,y;
}
//...
Point p = nullptr;

有什么办法可以解决吗?

C++ oop null

评论

6赞 user12002570 5/20/2022
p不是示例中的指针。请使用(参考)一本好的 C++ 书
0赞 πάντα ῥεῖ 5/20/2022
你需要一个指针来做到这一点: 但你不应该在 c++ 中真正这样做。内存管理与 c# 完全不同。Point* p = nullptr;
4赞 DownloadPizza 5/20/2022
类是 C++ 中的值类型。您正在尝试以 c# 思维方式进行 C++,这将工作,也不能工作
3赞 WhozCraig 5/20/2022
将替代语言代码从一种代码“适应”到另一种语言代码是导致错误代码的秘诀。你最大的成功来自于(a)对两种语言都了如指掌,(b)理解前者所要解决的问题,最后(c)正确地实施了后者中这些问题的解决方案。我怀疑这里的根本问题是(a),因为与C++相比,C#中的类类型的处理方式根本不同。
0赞 anastaciu 5/20/2022
如果您打算将来将新对象分配给该指针,则必须记住,在 C++ 内存中是非托管的,可以这么说,您将成为垃圾回收器。

答:

1赞 user12002570 5/20/2022 #1

问题是在您的示例中是非指针类型。这意味着它不能使用 .的类型是 。pnullptrpPoint

您可以创建一个指向 a 的指针,以便可以使用 a 对其进行初始化,如下所示:pPointnullptr

Point *p = nullptr; //p is a pointer to non-const Point object

如果要创建类类型的对象,则一种方法如下:Point

Point p{1, 3};

我还建议参考一本好的 C++ 书籍,以便更好地理解这个概念。

评论

0赞 Mateus Lima Silveira 5/20/2022
是的,我不确定,因为在 c# 中它可以工作,谢谢
1赞 Nitin Malapally 5/20/2022 #2

不能赋值给类,因为类是类型而不是变量。键入的内容是要求编译器找到一个接受 .nullptrPoint p = nullptr;Pointnullptr

您可以通过以下方式创建对象作为自动变量:Point

Point p = Point{1, 2}; // sets x = 2 and y = 3

或者干脆这样:

Point p;

但是,为此,您需要定义一个初始化的构造函数,并且由于您尚未为成员变量提供默认值。xy

根据此语句所在的上下文,将在堆或堆栈上分配。如果你在 main 函数中实例化,它将是后者。pp

您可以通过这样做来创建指向对象的指针:Point

Point* p = nullptr;

但是,您只会创建一个指针。您将需要进一步处理分配,您可以这样做:

Point* p = new Point{1, 2};

在这种情况下,您还应该在程序结束之前释放分配的内存,如下所示:

delete p;

评论

0赞 Mateus Lima Silveira 5/20/2022
我结束了对类的指针并修改了所有方法
0赞 πάντα ῥεῖ 5/20/2022
@mateus这是最糟糕的解决方案。