2013-03-25 101 views
2

例如,我已经定义的类为了在if语句中使用我的类,重载哪一个运算符?

class MyClass 
{ 
    .... 
}; 

哪个运营商我要在为了做到与MyClass对象如果比较超载?

如:

MyClass cc; 
if (cc) // compile error 
{ 
    //do some stuff 
} 

我试着用

bool operator == (int value) ; //guess the if() will call this 

bool operator != (int value) ; 

但两者给我一个编译错误!

+0

@FrédéricHamidi:在C++ 11的存在下,这个问题的答案看起来不同(现在建议使用明确的运算符bool而不是安全bool惯用法)。我不知道SO如何处理这种信息随着时间的变化...... – PlasmaHH 2013-03-25 14:03:57

+0

你的例子没有比较。如果你想隐式转换到'bool',定义'operator bool()'。顺便说一句,你永远不会覆盖操作员。您可以覆盖或超载一个。这些术语有不同的含义。 – 2013-03-25 14:04:55

+0

@PlasmaHH,在David Rodriguez的回答下的评论中指出。这应该没问题。 – 2013-03-25 14:06:07

回答

3

operator bool()是你想要的。它会照顾你班级的类型转换,输入bool

5

你应该提供一个bool转换操作符:

struct MyClass 
{ 
    explicit operator bool() const { return true; } 
}; 

这里,explicit操作来避免不必要的隐式转换为其他类型,特别是数字类型。请注意,这只能在C++ 11中使用。

+0

'显式'?你确定这个吗? – 2013-03-25 14:01:00

+2

@ bash.d是的,'explicit'在这里是正确的。 'if'表达式被“上下文转换为bool”,为此可以使用明确的操作符。它可以防止所有隐式转换的混乱。 – Angew 2013-03-25 14:02:04

+0

@Angew真棒!不知道这一个...你是否在Stroustrup的书中找到了它? – 2013-03-25 14:03:08

1

你可以覆盖operator bool(),但根据你的例子,你也可以考虑创建一个简单的方法,将返回bool。那么它的用法可能是这样的:例如:

MyClass cc; 
if (cc.isValid()) 
{ 
    // do some stuff 
} 

在这种情况下这将更直接并且更容易阅读。自定义操作符适用于很多事情,但不要强制执行。有时,最好只keep it simple :)

3

你必须为bool或东西转换为bool提供一个转换操作符。如果你有C++ 11,最好的办法是这样的:

class MyClass 
{ 
public: 
    explicit operator bool() const { 
    ... 
    } 
}; 

如果没有C++ 11(或至少其显式转换运营商的支持),事情变得有点复杂点(因为当你最不期待它的时候,隐式转换会让你感到痛苦)。有关详细信息,请参见safe bool idiom

+0

我不知道C++ 11为'explicit'关键字添加了一个新用法。 – 2013-03-25 14:32:34

+0

@MarkRansom是的,它的确如此,您现在可以拥有显式的转换运算符,而不仅仅是构造函数。 IMO非常有用。 – Angew 2013-03-25 14:50:41