C++,检查当我无法使用 NULL/0 时是否初始化了变量



我需要检查变量是否已初始化。我是C++新手,所以也许我以错误的方式思考这个问题。我想执行以下操作:

if (variable) {
// do some stuff
}

我的第一个想法是在声明时将值设置为 NULL。但是,事实证明 NULL 与 0 相同 C++。不幸的是,我的变量是一个可以为 0 的双精度值。我能在网上找到的解决方案都是关于指针的,只是说使用 nullptr,但这当然是不可能的。

我在这里有什么选择?

执行此操作的一般方法是使用std::optional

https://en.cppreference.com/w/cpp/utility/optional

此数据类型包装内部类型,并提供方法来告诉您是否已设置它。

请注意,您需要一个 C++ 17 编译器。

下面是一个示例。您可以看到它非常易于使用,并且不需要创建哨兵值(即在未设置的情况下解释的特殊值(。

#include <iostream>
#include <cstdlib>
#include <optional>
using namespace std;
int main()
{
optional<double> speed;
if (!speed)
{
cout << "speed not set" << endl;
}
speed = 0;
if (speed)
{
cout << "speed set to " << *speed << endl;
}
}

我在C++方面的知识非常有限,但从您的描述来看,我相信您使用的是原始的内置类型的C++(整数、双精度、布尔值等(。如果是这种情况,那么很难知道你的变量是否已初始化,因为基元类型都有其默认值,以防它被声明但没有赋值。

我过去解决这个问题的一种方法是始终使用特殊的默认值初始化变量。但是,如果变量恰好被分配了与默认值匹配的值,则可能是个问题。

但是,我发现这种情况很少发生,因为如果您使用的是库,那么该类应该有一个方法/变量......以在必要时通知您当前实例的状态。否则,该类应初始化默认有效值,或者您以错误的方式使用它。如果您正在创建自己的类,那么向其添加状态变量很容易,对吗?

就像我说的,我的知识非常有限,但我可能是错的。

最新更新