【问题标题】:Is it possible to set an object to null?是否可以将对象设置为空?
【发布时间】:2011-03-03 03:07:16
【问题描述】:

在我的代码中,我检查对象是否为空/空。

有没有办法将对象设置为空?

【问题讨论】:

    标签: c++ object null is-empty stdoptional


    【解决方案1】:

    一个类的对象不能设置为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;
    

    【讨论】:

    • 顺便说一句,对于想要提出它的人来说,是的,您可以重载 operator= 但这不是 OP 想要的。
    • 第一个可以使用Cat::operator=(...)。无论如何,看起来OP真的想检查一个指针。所以,+1。
    • @jweyrich:我知道有人会这么说,所以在你发表评论之前先看看我的评论 :)
    • 抱歉,我在发表评论之前没有更新页面。这只是为了完整性。很高兴你提到:)
    • @wulfgarpro 对于nullptr,您不需要任何包含,它是一个关键字。
    【解决方案2】:

    你可以设置任何指向NULL的指针,尽管NULL在C++中被简单地定义为0:

    myObject *foo = NULL;
    

    还要注意NULL 是在包含标准头文件时定义的,但不是内置在语言本身中的。如果 NULL 未定义,您可以使用 0 代替,或者包含以下内容:

    #ifndef NULL
    #define NULL 0
    #endif
    

    顺便说一句,如果你真的想设置一个对象,而不是一个指针,指向NULL,你可以阅读Null Object Pattern

    【讨论】:

      【解决方案3】:

      您想检查一个对象是否为 NULL/空。为 NULL 和为空是不一样的。就像 Justin 和 Brian 已经提到的那样,在 C++ 中,NULL 是您通常与指针相关联的赋值。您也许可以重载 operator=,但如果您真的想这样做,请仔细考虑。其他几件事:

      1. 在 C++ 中,NULL 指针与指向“空”对象的指针非常不同。
      2. 为什么不使用bool IsEmpty() 方法在对象的变量重置为某些默认状态时返回true?猜猜这可能会绕过 NULL 用法。
      3. 拥有类似A* p = new A; ... p = NULL; 的东西是不好的(没有删除p),除非你能确保你的代码会被垃圾回收。如果有的话,这会导致内存泄漏,并且有几个这样的泄漏很有可能你的代码很慢。
      4. 您可能希望这样做class Null {}; Null _NULL;,然后根据您的情况重载其他类的 operator= 和 operator!=。

      也许您应该向我们发布有关上下文的一些详细信息,以帮助您更好地使用选项 4。

      阿潘

      【讨论】:

      • “为什么不使用 bool IsEmpty() 方法...” - 有一些很好的理由不这样做。最重要的是,它是否有意义通常取决于上下文。更健壮的解决方案是使用boost::optional<T> 来指示您是否拥有有效的 T 对象。这将阻止您在 x.IsEmpty()==true 时调用 x.foo()
      【解决方案4】:

      虽然在 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,如果你的编译器提供了。
      【解决方案5】:

      “一个对象”是什么类型的?

      您当然可以将NULL(和nullptr)分配给指针类型的对象,如果您可以将NULL 分配给算术类型的对象,则它是实现定义的。

      如果您指的是某种类类型的对象,答案是(除了具有operator= 接受指针或算术类型的类)

      “空”更合理,因为许多类型既有复制分配又有默认构造(通常是隐式的)。要查看 现有对象 是否类似于默认构造的对象,您还需要一个适当的 bool operator==

      【讨论】:

        猜你喜欢
        • 2021-11-13
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 2020-01-31
        • 2022-11-25
        • 2016-06-06
        • 2020-12-23
        • 1970-01-01
        相关资源
        最近更新 更多