练习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的隐式转换。