一个小问题放倒一大批C++专家!

gpuboy 2012-07-04 07:08:36
首先把“陈伟柱”这个2B翻译永远地钉在历史的耻辱柱上!然后再把“孟岩”这个职业书托痛打50大板!最后再说我的问题:

首先请同学诸君找到《C++代码设计与重用》这本书(电子书网上有),请翻到第31页。

首先书中给出了一个有理数类:

class Rational
{
public:
Rational(int a, int b)
: num(a), denom(b)
{}

void reduce() const
{
int gcd = 2;

Rational* let_me_modify = (Rational*)this;
let_me_modify->num /= gcd;
let_me_modify->denom /= gcd;
}

private:
int num;
int denom;
};

接着书中有这样一段话(翻译中的错别字原文照录):


试图使用旧式的cast转型对const对应的X对象进行转型,只有当被转型的类X具有不少于一个的显示构造函数时,类X的转型后的对象才会有X原来定义的行为。(大多是重要的类都能满足这个限制条件,即至少有一个显式构造函数)

译注:如上例,是指只有当Rational具有公共构造函数时,转型后的对象Let_me_modify才能调用它的成员变量num和denom。”

这段话本人看不懂,请教了好几位月薪3万以上的C++高手都没有看懂是什么意思。网上遍寻英文原文而不得,所以无法把问题放到StackOverflow去。只有放到CSDN看看是否有看得懂的C++高人。

谢谢!
...全文
149 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gpuboy 2012-07-04
  • 打赏
  • 举报
回复
因为找不到原文,就无法准确判断原作者的本意。
gpuboy 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

书的作者举得这个例子不是很好。。。因为这个例子中的转型是对指针做的。。指针的转型就是简单的复制而已,根本不会出错。当时c++标准不完善,编译器也不太完善,如果是现在的话。。被转型的类型如果没有相对应的构造函数的话,直接就编译失败了。
另外既然LZ说译者是‘2B’,大可不必看2B翻译的书。。。免得耽误了您的前程。。。
[/Quote]

译注的说法显然是错的。姑且不去管它。

但是原文的说法是针对同一个类X,在X和const X之间转型。不是类X1和类X2之间转型。您的说法适用于后者,不适用于前者。前者不需要有构造函数即可转型。
gpuboy 2012-07-04
  • 打赏
  • 举报
回复
非常感谢beckhanyan的及时回复。

根据你的代码,去掉Rational的构造函数,没有任何影响。而书中的说法是:只有当被转型的类X具有不少于一个的显示构造函数时,类X的转型后的对象才会有X原来定义的行为。

盼明示。
beckhanyan 2012-07-04
  • 打赏
  • 举报
回复
书的作者举得这个例子不是很好。。。因为这个例子中的转型是对指针做的。。指针的转型就是简单的复制而已,根本不会出错。当时c++标准不完善,编译器也不太完善,如果是现在的话。。被转型的类型如果没有相对应的构造函数的话,直接就编译失败了。
另外既然LZ说译者是‘2B’,大可不必看2B翻译的书。。。免得耽误了您的前程。。。
beckhanyan 2012-07-04
  • 打赏
  • 举报
回复
首先LZ可以这么理解

class Rational
{
public:
Rational(int a, int b)
: num(a), denom(b)
{}

void reduce() const
{
int gcd = 2;

Rational* let_me_modify = (Rational*)this;
let_me_modify->num /= gcd;
let_me_modify->denom /= gcd;
}
int num;
int denom;
};

class Rational2
{
public:
void reduce() const
{
int gcd = 2;

Rational* let_me_modify = (Rational*)this;
let_me_modify->num /= gcd;
let_me_modify->denom /= gcd;
}
int num;
int denom;
};


int _tmain(int argc, _TCHAR* argv[])
{
const Rational r(1,1);
r.reduce();
cout << r.denom << ' ' << r.num << endl;
Rational2 rTemp;
rTemp.denom = 1;
rTemp.num = 1;
const Rational2 r2(rTemp);
r2.reduce();
cout << r2.denom << ' ' << r2.num << endl;
return 0;
}
taodm 2012-07-04
  • 打赏
  • 举报
回复
类X的转型后的对象
gpuboy 2012-07-04
  • 打赏
  • 举报
回复
class A
{};

int main()
{
const A b;
A& a = (A&)b;

return 0;
}

测试代码完全OK
gpuboy 2012-07-04
  • 打赏
  • 举报
回复
楼主怀疑原文和译注的说法都是错的。

经过代码检验,果然是无稽之谈。但不敢相信这样的专业书中会存在这样低级的知识性错误。故求教于各位高手。
出轨的火车头 2012-07-04
  • 打赏
  • 举报
回复
简单的一个类写成这样子有必要嘛?能写出来这样也不能显示水平能有多高!
gpuboy 2012-07-04
  • 打赏
  • 举报
回复
注意本书创作于1995年,当时C++尚未标准化。explicit还不是关键字。

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧