测试C ++对象的有效性,就像它是一个指针一样

时间:2015-02-05 16:51:04

标签: 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

AFAIK,没有bool返回的空操作符(类似于bool operator() {...})或任何其他可以实现此目的的技巧或习惯用法。

notNull()方法之外的任何可读解决方案的想法?感谢。

2 个答案:

答案 0 :(得分:3)

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

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

这允许它在布尔上下文中使用,例如if条件。 explicit是可选的,但最好是防止可能令人困惑的转换为数字类型。

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

答案 1 :(得分:0)

我认为你要小心使用运算符重载来指示有效性或初始化状态 - 特别是如果你将持有指针或对这种类型的对象的引用。

对于这种情况,我建议使用以下显式表示法:

if (Object.isValid()) use(Object);

通过这种方式,对于下一个完全按照您在此处执行操作的代码的人来说,这是显而易见的。对于使用它的人来说,操作符重载应该总是显而易见的,对对象的真/假检查意味着是否存在,不一定是有效或不。