在 C# 等C++中设置对象 = null 的替代方案是什么
what's the alternative of set object = null in C++ like C#
我有一个函数,类似于:
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;
将产生一个变量,该变量可以将引用到MyClass
或null
。在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;
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这句C++是什么意思?BaseWindow() : m_hwnd(NULL) { }.
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 测试指针是否为null的最有效方法是什么?
- C++`int*class::*member=NULL`编译,原因是什么
- "- < /dev/null"在"gcc -dM -E - < /dev/null"中是什么意思?
- NULL的含义是什么!=C++中的值
- 在 C# 等C++中设置对象 = null 的替代方案是什么
- 标准 IO C++无法正常输出 NULL 的原因是什么?