15.34
Query q = Query("fiery") & Query("bird")|Query("wind")
a:
Query(const string&)
Query(const string&)
Query operator&(const Query&, const Query&)
Query(const string&)
Query operator|(const Query&, const Query&)
b.
BinaryQuery::rep()
c.AndQuery::eval()
OrQuery::eval()
15.35
class Query_base {
friend class Query;
protected:
virtual ~Query_base() = default;
private:
virtual QueryResult eval(const TextQuery&) const = 0;
virtual string rep() const = 0;
};
class Query {
friend Query operator~(const Query&);
friend Query operator|(const Query& lq, const Query& rq);
friend Query operator&(const Query& lq, const Query& rq);
public:
Query(const string&);
QueryResult eval(const TextQuery & t)const {return q->eval(t);}
string rep()const {return q->rep();}
private:
Query(shared_ptr<Query_base> theQ) : q(theQ) { cout << "Query(shared_ptr<Query_base> theQ" << endl; }
shared_ptr<Query_base> q;
};
ostream& operator<<(ostream& os, const Query& q){
os << q.rep();
return os;
}
class WordQuery : public Query_base {
friend class Query;
WordQuery(const string & s):query_word(s){ cout << "WordQuery(const string & s)" << endl; }
QueryResult eval(const TextQuery & t)const {return t.query(query_word);}
string rep()const{return query_word;}
string query_word;
};
inline Query::Query(const string& s): q(new WordQuery(s)){ cout << "Query(const string &)" << endl; }
class NotQuery : public Query_base {
friend Query operator~(const Query& q);
NotQuery(const Query& q):query(q){ cout << "NotQuery()" << endl; }
QueryResult eval(const TextQuery & t)const{return QueryResult(0,0,0);}
string rep()const {return "~(" + query.rep() +")" ;}
Query query;
};
Query operator~(const Query& q){
return shared_ptr<Query_base>(new NotQuery(q));
}
class BinaryQuery :public Query_base {
protected:
BinaryQuery(const Query& l , const Query& r, const string& s):lhs(l),rhs(r),opSym(s){ cout << "BinaryQuery(const Query& l , const Query& r, const string& s)" << endl; }
string rep()const {return "("+lhs.rep()+ " "+ opSym + " " + rhs.rep()+ ")";}
private:
Query lhs, rhs;
string opSym;
};
class AndQuery : public BinaryQuery {
friend Query operator&(const Query& lq, const Query& rq);
AndQuery(const Query & lq, const Query & rq): BinaryQuery(lq,rq,"&"){ cout << "AndQuery(const Query & lq, const Query & rq)" << endl; }
QueryResult eval(const TextQuery& t)const{ return QueryResult(0, 0, 0); }
};
Query operator&(const Query& lq, const Query& rq){
cout << "operator&(const Query& lq, const Query& rq)" << endl;
return shared_ptr<Query_base>(new AndQuery(lq,rq));
}
class OrQuery : public BinaryQuery {
friend Query operator|(const Query& lq, const Query& rq);
OrQuery(const Query & lq, const Query & rq) : BinaryQuery(lq, rq, "|") {cout << "OrQuery(const Query & lq, const Query & rq)"<< endl;}
QueryResult eval(const TextQuery& t)const{ return QueryResult(0, 0, 0); }
};
Query operator|(const Query& lq, const Query& rq) {
cout << "operator|(const Query& lq, const Query& rq)" << endl;
return shared_ptr<Query_base>(new OrQuery(lq, rq));
}
15.36
a:
Query(const string&)
Query operator&(const Query&, const Query&)
WordQuery(const string & s)
Query(const string &)
WordQuery(const string & s)
Query(const string &)
WordQuery(const string & s)
Query(const string &)
operator&(const Query& lq, const Query& rq)
BinaryQuery(const Query& l , const Query& r, const string& s)
AndQuery(const Query & lq, const Query & rq)
Query(shared_ptr<Query_base> theQ
operator|(const Query& lq, const Query& rq)
BinaryQuery(const Query& l , const Query& r, const string& s)
OrQuery(const Query & lq, const Query & rq)
Query(shared_ptr<Query_base> theQ
b:
BinaryQuery::rep()
WordQuery::rep()
BinaryQuery::rep()
WordQuery::rep()
WordQuery::rep()
T.T全错
15.37
需要用reset进行赋值
15.38
a不合法, BinaryQuery的eval是纯虚函数
b,不能进行Query和AndQuery之间的转换
c,不能进行QUery和OrQuery之间的转换