c++ - 像测试指针一样测试 C++ 对象的有效性

标签 c++ object null operator-overloading operators

假设我有一个可能未正确初始化的对象,但它不仅仅是一个指向对象的空指针;它是一个空指针。它是一个具有空或未初始化成员的对象。但我想以可读的方式检查它,就像它是一个指针一样:

if (Object) use(Object);

例如,Object 可能有一个 int 字段,如果该字段为 0,则被视为未初始化。然后,我可以使 ! 重载。像这样的运算符:

bool operator!() const {return intField == 0;}

我可以像这样使用它:

if (! Object)  initialize (Object);

问题是,如果我想测试相反的条件(非空),我不能这样做:

if (Object)...

我只发现尴尬的可能性:

if (! (! Object))...  // awful
if (Object.notNull()) // not so bad

最接近我愿望的一个令人困惑:

bool operator()() {return intField != 0;}
if (Object())...   // it looks a lot like an argument-less constructor

据我所知,没有 bool 返回空运算符(例如 bool operator() {...})或任何其他可以实现此目的的技巧或习惯用法。

除了 notNull() 方法之外,还有什么可读的解决方案吗?谢谢。

最佳答案

您可以提供类型转换运算符,以允许转换为 bool:

explicit operator bool() const {return intField != 0;}

这允许它在 bool 上下文中使用,例如 if 条件。 显式 是可选的,但这是防止可能混淆的数字类型转换的好主意。

另一种方法是使用 Boost.Optional或类似的,使任何类型可为空。

关于c++ - 像测试指针一样测试 C++ 对象的有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28349587/

相关文章:

c++ - #包括任何地方

java - (PircBotX,Java和Twitch)应如何应用该对象?

c++ - 使用来自自身 C++ 的变量

c++ - 指针数组成员,是否初始化?

java - Android-获取customListview中第一行的值(共享首选项)

c++ - MySQL QUOTE() vs mysql_real_escape_string()?

C++0X memory_order 无围栏,应用,支持的芯片

c++ - 类型转换的 C++ 指针和非类型转换指针指向相同的位置,但给出不同的值

javascript - Array 中的对象,如何解决这个问题?

CakePHP 如何提交NULL 值?