当前位置: 代码迷 >> C++ >> C++ bool不能用种完美实现么?(Exceptional C++的困惑)
  详细解决方案

C++ bool不能用种完美实现么?(Exceptional C++的困惑)

热度:2491   发布时间:2013-02-26 00:00:00.0
C++ bool不能用类完美实现么?(Exceptional C++的困惑)
本帖最后由 youyou1912 于 2012-01-05 21:45:47 编辑
各位大侠,一个问题,看Exceptional C++时,小弟有些模糊,

在《Exceptional C++》中,第 45款 C++为何一定需要 bool ?
该书中列举了四种主要的以 C++ 语言其他设施实现 bool 的方法,并举述其缺
陷∶
其中第四个方法 (9/10分):
class BOOL {
public:
BOOL() { b_ = 0; }
BOOL(int x) { b_ = (x!=0 ? 1 : 0); }
BOOL& operator=(int x) { b_ = (x!=0 ? 1 : 0); return *this;}
operator int() const { return b_; }
const BOOL operator == (const BOOL x) { return x.b_ == b_ ? BOOL(1): BOOL(0); }
private:
unsigned char b_;
};
const BOOL TRUE(1);
const BOOL FALSE(0);

有谈到:如果为了要让 class 版本的 bool 可以支持上述的使用方法,
它又会干扰 overload resolution。 这个地方不是很明白。

我用了下面2个函数,并附带测试,用VC2008编译,貌似并无影响。。。大家是怎么理解的,可否指点一二?


void test(BOOL x) { std::cout << "in bool" << std::endl; }
void test(int x) { std::cout << "in int" << std::endl; }

BOOL x;
x = 3;
if (x == TRUE)
{
std::cout << (int)x.b_ << std::endl;
}
if (!x)
{
std::cout << (int)x.b_ << std::endl;
}
test(x);


------解决方案--------------------------------------------------------
你这个代码问题 你最后一排的代码 对私有成员进行了操作,是不行滴 我修改了下 我不知道你要的是不是这个 
#include<iostream>

using namespace std;

class BOOL {
public:
BOOL() { b_ = 0; }
BOOL(int x) { b_ = (x!=0 ? 1 : 0); }
BOOL& operator=(int x) { b_ = (x!=0 ? 1 : 0); return *this;}
operator int() const { return b_; }
const BOOL operator == (const BOOL x) { return x.b_ == b_ ? BOOL(1): BOOL(0); }
private:
unsigned char b_;
};
const BOOL TRUE(1);
const BOOL FALSE(0);


void test(BOOL x) { std::cout << "in bool" << std::endl; }
void test(int x) { std::cout << "in int" << std::endl; }


void main()
{
BOOL x;
x = 3;
test(x);

}
------解决方案--------------------------------------------------------
#include<iostream>

using namespace std;

class BOOL {
public:
BOOL() { b_ = 0; }
BOOL(int x) { b_ = (x!=0 ? 1 : 0); }
BOOL& operator=(int x) { b_ = (x!=0 ? 1 : 0); return *this;}
operator int() const { return b_; }
const BOOL operator == (const BOOL x) { return x.b_ == b_ ? BOOL(1): BOOL(0); }
private:
unsigned char b_;
};
  相关解决方案