【发布时间】:2011-03-03 03:07:16
【问题描述】:
在我的代码中,我检查对象是否为空/空。
有没有办法将对象设置为空?
【问题讨论】:
标签: c++ object null is-empty stdoptional
在我的代码中,我检查对象是否为空/空。
有没有办法将对象设置为空?
【问题讨论】:
标签: c++ object null is-empty stdoptional
一个类的对象不能设置为NULL;但是,您可以将指针(包含对象的内存地址)设置为 NULL。
你问的不能做的例子:
Cat c;
c = NULL;//Compiling error
你可以做什么的例子:
Cat c;
//Set p to hold the memory address of the object c
Cat *p = &c;
//Set p to hold NULL
p = NULL;
【讨论】:
Cat::operator=(...)。无论如何,看起来OP真的想检查一个指针。所以,+1。
nullptr,您不需要任何包含,它是一个关键字。
你可以设置任何指向NULL的指针,尽管NULL在C++中被简单地定义为0:
myObject *foo = NULL;
还要注意NULL 是在包含标准头文件时定义的,但不是内置在语言本身中的。如果 NULL 未定义,您可以使用 0 代替,或者包含以下内容:
#ifndef NULL
#define NULL 0
#endif
顺便说一句,如果你真的想设置一个对象,而不是一个指针,指向NULL,你可以阅读Null Object Pattern。
【讨论】:
您想检查一个对象是否为 NULL/空。为 NULL 和为空是不一样的。就像 Justin 和 Brian 已经提到的那样,在 C++ 中,NULL 是您通常与指针相关联的赋值。您也许可以重载 operator=,但如果您真的想这样做,请仔细考虑。其他几件事:
bool IsEmpty() 方法在对象的变量重置为某些默认状态时返回true?猜猜这可能会绕过 NULL 用法。A* p = new A; ... p = NULL; 的东西是不好的(没有删除p),除非你能确保你的代码会被垃圾回收。如果有的话,这会导致内存泄漏,并且有几个这样的泄漏很有可能你的代码很慢。 class Null {}; Null _NULL;,然后根据您的情况重载其他类的 operator= 和 operator!=。 也许您应该向我们发布有关上下文的一些详细信息,以帮助您更好地使用选项 4。
阿潘
【讨论】:
boost::optional<T> 来指示您是否拥有有效的 T 对象。这将阻止您在 x.IsEmpty()==true 时调用 x.foo()
虽然在 C++ 中对象不能为“空/空”,但在 C++17 中,我们使用 std::optional 来表达该意图。
使用示例:
std::optional<int> v1; // "empty" int
std::optional<int> v2(3); // Not empty, "contains a 3"
然后您可以检查optional 是否包含一个值
v1.has_value(); // false
或
if(v2) {
// You get here if v2 is not empty
}
然而,一个普通的int(或任何类型)在任何有用的意义上都不能是“null”或“empty”(根据您对这些词的定义)。在这方面将std::optional 视为一个容器。
如果您手头没有兼容 C++17 的编译器,则可以改用 boost.optional。一些 C++17 之前的编译器还提供 std::experimental::optional,其行为至少接近实际的 std::optional afaik。有关详细信息,请查看您的编译器手册。
【讨论】:
std::experimental::optional,如果你的编译器提供了。
“一个对象”是什么类型的?
您当然可以将NULL(和nullptr)分配给指针类型的对象,如果您可以将NULL 分配给算术类型的对象,则它是实现定义的。
如果您指的是某种类类型的对象,答案是否(除了具有operator= 接受指针或算术类型的类)
“空”更合理,因为许多类型既有复制分配又有默认构造(通常是隐式的)。要查看 现有对象 是否类似于默认构造的对象,您还需要一个适当的 bool operator==
【讨论】: