第十五章 15.9.3节练习

练习15.34

针对图15.3(第565页)构建的表达式:

(a) 列举出在处理表达式过程中所有构造函数。

(b) 列举出cout << q所调用的rep。

(c) 列举出q.eval()所调用的eval。

解答:

(a) Query q = Query("Fiery") & Query("bird") | Query("wind");

可以将这个表达式进行化简:

Query Fiery = Query("Fiery");

Query bird = Query("bird");

Query wind = Query("wind");

这里就用到了Query的构造函数。①

再就按照运算顺序,从左往右:

AndQuery and = Firey & bird;

这里就要用到AndQuery的构造函数。②

不过,AndQuery类是从BinaryQuery类继承而来,

所以在调用到AndQuery的构造函数之前,

需要调用BinaryQuery类的构造函数。③

BinaryQuery类是从Query_base继承而来,

我们在Query_base中没有看到构造函数,但是编译器会合成一个构造函数。

所以,这里又调用了Query_base的构造函数。④

当全部构造完毕。

AndQuery and = Firey & bird;

就计算完成了。

最后,OrQuery or = and | wind;

这里首先调用了OrQuery的构造函数。⑤

剩下的过程与AndQuery调用构造函数的情况相同。

(b) 

((Fiery & bird) | wind)

(c) 

因为在OrQuery中,eval有重载,所以eval()也是调用的OrQuery的。


练习15.35

实现Query类和Query_base类,其中需要定义rep而无须定义eval。

解答:

类的实现参照书中的实现。

只定义rep是要为了打印而用的。


练习15.36

在构造函数和rep成员中添加打印语句添加答应语句,运行你的代码以检验你对本节第一题中(a)(b)两小题回答是否正确:

解答:

可以将自己写的,或者从网上下载本书源码进行设置后,调试后进行测试以上回答是否正确。


练习15.37

如果在派生类中含有shared_ptr<Query_base>类型的成员而非Query类型的成员,则你的类需要作出怎么样的改变?

解答:

如果使用书中源码,需要改的东西还真的挺多的。

为了表明这题的意义,这里引用别的blog中的文章,对基类指针进行分析。

在类似C的强行转换会比shared_ptr要明了很多,当然这里还需要注意shared_ptr的使用。


练习15.38

下面的声明合法吗?如果不合法请解释原因;如果合法,请指出该声明的含义。

BinaryQuery a = Query("fiery") & Query("bird");

AndQuery b = Query("fiery") & Query("bird");

OrQuery c = Query("fiery") & Query("bird");

解答:

都不合法,都缺少转换函数,无法完成Query向OrQuery, AndQuery, BinaryQuery的隐式转换。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值