可以将任何类对象作为测试表达式传递给任何测试表达式,例如if,而像ifstream对象。 在C++中,我可以使用我的对象作为测试表达式,比如 IFSturi对象。若否,原因为何

可以将任何类对象作为测试表达式传递给任何测试表达式,例如if,而像ifstream对象。 在C++中,我可以使用我的对象作为测试表达式,比如 IFSturi对象。若否,原因为何,c++,C++,e、 g 我有一个类,我需要重载哪个操作符才能让编译器允许我的对象作为测试表达式传递 e、 g 两者都应该是有效的表达式。您有几个选项。最好的方法可能是重载操作符bool()。像这样: class A{ public: operator bool() { return flag; } private: bool flag; }; 编辑:如注释中所指出的,如果使用C++11,最好在前面添加explicit关键字,使操作符显式。否则,可能最好使用操作符voi

e、 g

我有一个类,我需要重载哪个操作符才能让编译器允许我的对象作为测试表达式传递

e、 g


两者都应该是有效的表达式。

您有几个选项。最好的方法可能是重载
操作符bool()
。像这样:

class A{
 public:
   operator bool()
   {
     return flag;
   }

 private:
   bool flag;
};

编辑:如注释中所指出的,如果使用
C++11
,最好在前面添加
explicit
关键字,使操作符显式。否则,可能最好使用
操作符void*()

有几个选项。最好的方法可能是重载
操作符bool()
。像这样:

class A{
 public:
   operator bool()
   {
     return flag;
   }

 private:
   bool flag;
};

编辑:如注释中所指出的,如果使用
C++11
,最好在前面添加
explicit
关键字,使操作符显式。否则,最好使用
操作符void*()

在类中实现
bool
重载。大概是这样的:

class myClass {
    public:
        explicit operator bool() const { return condition; }
};
class SomeClass {
    operator bool() {
        return true; // a boolean expression should go here.
    }
}
struct S
{
    bool is_good() const { return ...; }  // Whatever name.
};

它将在
if
while
语句中工作。但是,如果编译器不支持C++11,则不能在此重载中使用
explicit
关键字。

必须在类中实现
bool
重载。大概是这样的:

class myClass {
    public:
        explicit operator bool() const { return condition; }
};
class SomeClass {
    operator bool() {
        return true; // a boolean expression should go here.
    }
}
struct S
{
    bool is_good() const { return ...; }  // Whatever name.
};

它将在
if
while
语句中工作。但是,如果您的编译器不支持C++11,则不能在此重载中使用
explicit
关键字。

这是
运算符bool()
您需要重载来提供此行为。但是,只有当转换有合理的语义含义时,才可以这样做,这是该类所有用户都希望看到的

这是
操作符bool()
您需要重载以提供此行为。但是,只有当转换有合理的语义含义时,才可以这样做,这是该类所有用户都希望看到的

编译器将尝试将表达式隐式强制转换为bool,因此需要向类中添加一个,如下所示:

class myClass {
    public:
        explicit operator bool() const { return condition; }
};
class SomeClass {
    operator bool() {
        return true; // a boolean expression should go here.
    }
}
struct S
{
    bool is_good() const { return ...; }  // Whatever name.
};
这将允许您的类被强制转换为布尔类型,因此允许在if、while等中使用它。。。 但是,需要注意的是,这允许从您的类型隐式转换到bool,确保这是有意义的,这一点很重要

通常更明智的做法是为行为提供一种方法,例如:

while (myObj.hasMoreElements())


这使得测试内容立即变得清晰。但是,如果到bool的转换是有意义的,那就去做吧。

您的编译器将尝试将表达式隐式强制转换为bool,因此您需要向类中添加一个,如下所示:

class myClass {
    public:
        explicit operator bool() const { return condition; }
};
class SomeClass {
    operator bool() {
        return true; // a boolean expression should go here.
    }
}
struct S
{
    bool is_good() const { return ...; }  // Whatever name.
};
这将允许您的类被强制转换为布尔类型,因此允许在if、while等中使用它。。。 但是,需要注意的是,这允许从您的类型隐式转换到bool,确保这是有意义的,这一点很重要

通常更明智的做法是为行为提供一种方法,例如:

while (myObj.hasMoreElements())


这使得测试内容立即变得清晰。但是,如果转换到bool是有意义的,那么就去做。

您可以重载任意数量的类型转换运算符;这个 传统的方法是
操作符void*()()const
,返回空值 用于false的指针,以及非空指针(传统的
this
) 没错。在C++11中,还可以重载
显式运算符
bool()常量,但如果您的编译器
还不允许显式的
bool
是一个 整数类型,如果没有显式
,它将转换 对于任何其他积分类型,都可能导致一些令人惊讶的过载 决议

如果这样做,还应该重载
操作符!()常数
,所以 如果(!myObj)
也定义得很好,那么

最后,你真的应该考虑一下你是否愿意 这样做。ostream类没有受到惩罚,因为他们 作为标准的一部分,每个人都看到、使用和了解它们, 而
while(someStream>>object)
这个成语无处不在。 但总的来说,这是一种误导,是对运营商的滥用 任何具有两个以上可能类型的类的重载 国家;
是有效的
是已就绪的
或任何更有效的函数
适当。

您可以重载任意数量的类型转换运算符;这个 传统的方法是
操作符void*()()const
,返回空值 用于false的指针,以及非空指针(传统的
this
) 没错。在C++11中,还可以重载
显式运算符
bool()常量,但如果您的编译器
还不允许显式的
bool
是一个 整数类型,如果没有显式
,它将转换 对于任何其他积分类型,都可能导致一些令人惊讶的过载 决议

如果这样做,还应该重载
操作符!()常数
,所以 如果(!myObj)
也定义得很好,那么

最后,你真的应该考虑一下你是否愿意 这样做。ostream类没有受到惩罚,因为他们 作为标准的一部分,每个人都看到、使用和了解它们, 而
while(someStream>>object)
这个成语无处不在。 但总的来说,这是一种误导,是对运营商的滥用 任何具有两个以上可能类型的类的重载 国家;
是有效的
是已就绪的
或任何更有效的函数
合适。

有很多选择

您不必实现
操作符bool