第十五章 15.9.4节练习

本文探讨了C++中Query类及Query_base类的设计与实现,包括eval函数的行为分析,针对不同情况的处理方式,以及从shared_ptr到内置指针的转换策略。

练习15.39

实现Query类和Query_base类,求图15.3(第565页)中表达式的值并打印相关信息,验证你的程序是否正确。

解答:

这题和35题很类似,需要多验证的一个函数就是eval()成员函数的实现。


练习15.40

在OrQuery的eval函数中,如果rhs成员返回的是空集将发生什么?如果lhs是空集呢?如果lhs和rhs都是空集又将发生什么?

解答:

这里为了符合“或”行为,左右分别为空时,只会出现一侧的值;左右都为空的时候,将返回空集。


练习15.41

重新实现你的类,这次使用指向Query_base的内置指针而非shared_ptr。请注意,做出上述改动后你的类将不能再使用合成拷贝控制成员。

解答:

class Query {
    // these operators need access to the shared_ptr constructor
    friend Query operator~(const Query &);
    friend Query operator|(const Query&, const Query&);
    friend Query operator&(const Query&, const Query&);
public:
    Query(const std::string&);  // builds a new WordQuery
	Query(const Query& ori):q(ori.q){}

    // interface functions: call the corresponding Query_base operations
    QueryResult eval(const TextQuery &t) const 
                            { return q->eval(t); }
	std::string rep() const { return q->rep(); }
private:
    //Query(std::shared_ptr<Query_base> query): q(query) { }
    //std::shared_ptr<Query_base> q;
	Query(Query_base *query) : q(query){}
	Query_base *q;
};
这里说的类应该是Query类吧。我对这个类进行如上的改动。

当然,在实际程序中还要对其他实现进行修改。

但是,在源码中修改的地方太多,就不贴出来了。


练习15.42

略,这里使用书中源码进行修改,代码有些多,就不粘代码了。我选了比较简单的(a)。

简单的说一下思路,

其实按句子和按行分是一样的,只是分隔符不同而已,在TextQuery读取的时候,使用的是getline进行读取的,默认的是’\n‘换行符为一个终止。

这里我们可以对getline的第三个参数进行设置,将其设置为’.‘,就能按照句子查询了。(不过这里的换行符被放在句子中了,如果不喜欢,可以用replace函数将其都替换掉成空字符串即可)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值