【问题标题】:Variable not initialized as condition c++变量未初始化为条件 C++
【发布时间】:2013-06-07 18:44:36
【问题描述】:

我想做一个如果喜欢:

if(x has not been initialized)
{...
}

这可能吗?谢谢

【问题讨论】:

  • 不,不是。这就是为什么最好在声明时初始化所有变量的原因。 (在作品“初始化”的标准含义中)。您当然可以设计您的课程并将“初始化”定义为“在您调用 Init() 之后,但这是不同的。
  • 如果你需要这种东西,也许看看boost::optional或C++14 std::optional
  • x的存储时长是多少?如果是静态的,那是完全有可能的。
  • 只是好奇我们要检查 x 是否已初始化。如果您有问题陈述,请更新主题。

标签: c++ if-statement


【解决方案1】:

“没有办法检查变量的内容是否未定义。您可以做的最好的事情是分配一个信号/哨兵值(例如在构造函数中)以指示进一步初始化将需要执行。”

Alexander Gessler

来自here

【讨论】:

    【解决方案2】:

    要实现该行为,您可以使用指针,默认初始化为 0。

    例如:

    int *number = 0;
    // ...
    if (!number) {
        // do something
    }
    

    您可以对任何类型使用该技巧,而不仅仅是整数:

    Cat *kitty = 0;
    // ...
    if (!kitty) {
        // do something
    }
    

    【讨论】:

      【解决方案3】:

      a) 对于 int 等原始数据类型,float 无法知道其是否已初始化。

      b) 对于指针,您可以检查它是否不是 nullptr

      if(ptr != nullptr)
      {
      }
      

      c) 对于自定义类,你需要引入 bool 成员,该成员可以在构造函数中设置为 true,以便我们可以使用它来检查对象是否已初始化。

      if(obj.isInitialized())
      {
      }
      

      【讨论】:

        【解决方案4】:
        • 如果有指针,可以用nullptr表示“未初始化”。
        • 如果你有一个非指针,你可以使用boost::optional<T>(或std::optional<T>,当它可用时)。
        • 否则,天真的“bool initialized;”标志将不得不这样做。 optional<T> 基本上只是封装了这个标志。

        【讨论】:

          【解决方案5】:

          对于 C++-11,您可以考虑使用智能指针存储变量。将 yor 变量 x(假设 x 为 int)声明为

          std::shared_ptr<int> x;
          

          分配变量x时,使用

          x = std::make_shared<int>(newValueOfX);
          

          然后您可以通过检查确定是否曾经分配过x

          if (this->x) { ... }
          

          有关更详细的示例,请参阅Checking if a variable is initialized

          【讨论】:

            【解决方案6】:

            嗯,类似的东西适用于指针。说:

            int* x = NULL;  //initialize
            if(x == NULL)
            {
                //dostuff
            }
            

            或者干脆

            if(!x)
            {
                //dostuff
            }
            

            不确定是否有办法只使用常规 int

            编辑:现在我想起来了,Luthian 是对的。那将是未定义的行为。正如其他人所说,您必须初始化为某个已知值。

            【讨论】:

            • 没有。那是未定义的行为。在调试版本之外(可以说),x 很可能不会被初始化为 NULL
            • 是的,你是对的@LuchianGrigore 现在我想了。
            猜你喜欢
            • 2021-09-07
            • 1970-01-01
            • 2017-09-21
            • 1970-01-01
            • 2016-07-31
            • 1970-01-01
            • 2021-06-03
            • 2016-11-14
            • 1970-01-01
            相关资源
            最近更新 更多