练习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函数将其都替换掉成空字符串即可)