在 C# 等C++中设置对象 = null 的替代方案是什么

what's the alternative of set object = null in C++ like C#

本文关键字:null 是什么 方案 对象 C++ 设置      更新时间:2023-10-16

我有一个函数,类似于:

MyClass1 mc1, mc0; //Single Object
MyClass2 mc2; //vector of MyClass1
mc1.Init(1);
mc2.Add(mc1);
mc1 = mc0;
mc1.Init(2);
mc2.Add(mc1);
mc1 = mc0;
//so on......

我实际上想在步骤开始之前设置mc1 = null,但在c++中不能这样做。所以我保留了一个未初始化的mc0。不要认为这是一个优雅的解决方案。我的背景主要是c#和ASP。. NET管理。(我认为c++的unmanaged属性是我不能做object = null的原因。对吧?)

这与语言是否受管理无关,而是与c++对对象引用的不同方法有关。在c#中,声明MyClass mc;将产生一个变量,该变量可以引用到MyClassnull。在c++中,MyClass mc;产生的变量一个MyClass——对象实例完全包含在变量中,因此,变量不能是null。如果需要引用,通常使用指针: MyClass * mc = NULL;MyClass * mc = new MyClass();

MyClass *mc1是指向你的类的指针,可以赋值给0

MyClass mc1是你的类的一个实例,因为你没有用int重载=操作符,所以你不能给它赋值0

在c#中只有指向类的指针,所以等价于c#的MyClass mc1在c++中是MyClass *mc1

这个怎么样:

mc1 = MyClass();

这是假设MyClass有一个默认构造函数

就像这里的每个人都说过的那样,在c++中,您不能也不能简单地将null赋值给对象实例。但是,您可以将指向对象的指针赋值为NULL。在VS 2010中,使用vc10.0编译器,你可以用nullptr代替NULL。vc10.0编译器对这两者的用法更严格一些。不管怎样,这似乎不是你在这里需要的。在您的示例中,您应该让mc1调用某种方法,将其重置为已知的预定义状态。

注意:我认为你是在试图避免MyClass1对象的重建?如果您正在使用std::vector并将这些实例"添加"到其中,那么对象将再次被复制,因为vector会复制放入其中的内容。如果你想加快速度,你可以保留一个指向对象实例的指针向量。但这是一个全新的局面,而且还会产生其他后果。

在c++中不这样做。要向矢量中添加对象,可以执行

std::vector<MyClass1>   mc2;
mc2.push_back(MyClass1(1));
mc2.push_back(MyClass1(2));

不需要创建中间引用,也不需要释放它们

在c++中没有办法将对象设置为NULL -另一方面,可以将指针设置为NULL。根据您的设计目标,您可能需要a)开始使用指针,或者b)调用mc1.Init(0);(假设0是您所说的NULL)。

编辑:另一个答案建议调用mc1 = MyClass();,这也是一个可行的选择,如果你不关心什么值是包含在mc1(或者你知道默认构造函数将初始化变量的方式,这样有一个默认构造变量是一个可接受的替代NULL

在c++中,MyClass1 mc1实际上创建了一个MyClass1类型的对象mc1。如果您希望变量最初具有空值,那么您应该使mc1成为MyClass1类型的指针,而不是对象。下面是一个简单的例子,向您展示(不要忘记您将负责使用delete清除对象)

MyClass* mc1 = null;
....
mc1 = new MyClass();
mc1->Init(1);
mc2.Add(*mc1); 
// if you are adding object, if your vector hold pointer, then it will be 
// mc2.Add(mc1);
.......
mc1 = null;