[2018年5月26号]C++ primer 课后练习 第十五章 面向对象程序设计

本文介绍了一个查询系统的实现细节,包括如何定义基本查询类及其派生类来构建复杂的查询逻辑。文章详细展示了不同类型的查询对象(如WordQuery, AndQuery, OrQuery等)是如何通过组合而非继承来创建更复杂的查询条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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之间的转换



Query(const string&)
Query operator&(const Query&, const Query&)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值