Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;将类转换为布尔值 使用C++的所有基本类型,可以简单地查询: if(varname)_C++_Boolean_User Defined Types - Fatal编程技术网

c++;将类转换为布尔值 使用C++的所有基本类型,可以简单地查询: if(varname)

c++;将类转换为布尔值 使用C++的所有基本类型,可以简单地查询: if(varname),c++,boolean,user-defined-types,C++,Boolean,User Defined Types,并将类型转换为布尔值进行计算。有没有办法在用户定义的类中复制此功能?我的一个类由一个整数标识,尽管它有许多其他成员,我希望能够检查整数是否以这种方式设置为NULL 谢谢。只需为您的类实现操作符bool() e、 g 可以定义用户定义的转换运算符。这必须是一个成员函数,例如: class MyClass { operator int() const { return your_number; } // other fields }; 您还可以实现操作符bool。但是,我强烈建议不要这

并将类型转换为布尔值进行计算。有没有办法在用户定义的类中复制此功能?我的一个类由一个整数标识,尽管它有许多其他成员,我希望能够检查整数是否以这种方式设置为NULL


谢谢。

只需为您的类实现
操作符bool()

e、 g


可以定义用户定义的转换运算符。这必须是一个成员函数,例如:

class MyClass {
  operator int() const
  { return your_number; }
  // other fields
};
您还可以实现操作符bool。但是,我强烈建议不要这样做,因为你的类将在算术表达式中变得可用,这可能会很快导致混乱。例如,IOStreams定义到
void*
的转换。您可以使用与测试
bool
相同的方法测试
void*
,但是没有来自
void*
的语言定义的隐式转换。另一种选择是定义
运算符具有所需的语义


简而言之:将转换运算符定义为整数类型(包括布尔型)是一个非常糟糕的主意。

C++检查语句结果是否等于零。因此,我认为您可以为类定义相等运算符,并定义类在哪些条件下与零不同。

如其他人所述,使用
运算符int()
运算符bool()
是个坏主意,因为它允许进行转换。使用指针是更好的主意。到目前为止,最广为人知的解决方案是返回成员(函数)指针:

C++11方法是:

struct Testable
  {
    explicit operator bool() const
      { return false; }
  };

int main ()
  {
    Testable a, b;
    if (a)      { /* do something  */ }  // this is correct
    if (a == b) { /* do something  */ }  // compiler error
  }

请注意
explicit
关键字会阻止编译器进行隐式转换。

-1,这很容易以不明显的方式中断。查找“安全布尔习惯用法”。C++0x具有
显式运算符Bool()
以避免此类隐式破坏?@grayfade:同意-此解决方案并不理想,安全布尔习惯用法是一种更稳健的方法。谷歌搜索“安全布尔”,您将看到不同的解决方案,允许布尔求值,而无需显式转换为Bool,避免常见的转换陷阱。您声明转换为整数类型是个坏主意。。但这正是您的代码片段所做的。同意
运算符bool()
会产生意外后果,并且有更好的解决方案。但是转换为void*也不是完美的:
foox;删除x现在将编译<代码>布尔运算符!()
更好,但是您仍然需要执行
if(!!x)
来测试阳性情况。正如在另一篇评论中所建议的,Safe-Bool习语是最好的解决方案。1)OP显然不知道定义转换运算符的语法,否则他将能够编写最简单的解决方案。所以他学到了一些新东西。2) 我警告过他这是个坏主意。3) 安全布尔更好,但似乎是一个过度工程。如果转换为void*对标准库有好处,对我也有好处。在C++11中,有
显式运算符bool()
(在@plats answer和@UncleBens注释中提到)实现了OP想要的功能。我认为,如果这些信息能被包括在被接受的答案中,那将是一件好事。。。该值将转换为布尔值。只是一般来说,转换是从
0
false
以及从任何其他内容到
true
的。重要的区别在于,如果定义
bool操作符==(类型const&,int)
bool运算符==(int,类型const&)可以将对象与
0
进行比较,但不能将对象用作条件。
class MyClass {
  void some_function () {}

  typedef void (MyClass:: * safe_bool_type) ();
  operator safe_bool_type () const
  { return cond ? &MyClass::some_function : 0; }
};
struct Testable
  {
    explicit operator bool() const
      { return false; }
  };

int main ()
  {
    Testable a, b;
    if (a)      { /* do something  */ }  // this is correct
    if (a == b) { /* do something  */ }  // compiler error
  }