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

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&)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值