设为首页 加入收藏

TOP

C++ Primer中文本查询示例Query的实现(一)
2015-07-20 18:05:22 来源: 作者: 【 】 浏览:8
Tags:Primer 文本 查询 示例 Query 实现

最近在看C++ Primer复习C++的语法,看到书中15.9章中的文本查询示例时,觉得设计得非常不错,于是便动手照着实现了一个,修改了很久终于运行成功了,从中也学习到了很多的语法。下面把实现与总结分享给大家:

首先是在10.6.2节中实现的TextQuery类:

TextQuery.h

#ifndef __TestC____TextQuery__
#define __TestC____TextQuery__

#include 
  
   
#include 
   
     #include 
    
      #include 
      using namespace std; class TextQuery { public: typedef vector
      
       ::size_type line_no; TextQuery(string[], vector
       
        ::size_type); set
        
          run_query(const string&) const; line_no size() const; private: vector
         
           lines_of_text; }; #endif /* defined(__TestC____TextQuery__) */ 
         
        
       
      
    
   
  

TextQuery.cpp

#include "TextQuery.h"

TextQuery::TextQuery(string strArray[], vector
  
   ::size_type count) {
    lines_of_text.assign(strArray, strArray+count);
}

set
   
     TextQuery::run_query(const string&word) const { set
    
      ret_lines; for (int i=0;i
     
      
接下来是查询类的句柄类Query:

Query.h

#ifndef __TestC____Query__
#define __TestC____Query__

#include 
       
        
#include "TextQuery.h"


class Query_base;

class Query {
    friend Query operator~(const Query &);
    friend Query operator|(const Query &, const Query &);
    friend Query operator&(const Query &, const Query &);
public:
    Query(const string &);
    Query(const Query &);
    virtual ~Query();
    Query& operator=(const Query&);
    
    set
        
          eva l(const TextQuery&) const; ostream & display(ostream &) const; private: Query(Query_base *); Query_base *q; size_t *use; void decr_use(); }; inline ostream & operator<<(ostream &os, const Query &q) { return q.display(os); } #endif /* defined(__TestC____Query__) */ 
        
       

Query.cpp

#include "Query.h"
#include "Query_base.h"

Query::Query(const Query &c) : q(c.q), use(c.use) {
    ++*use;
}

Query::Query(const string &s) : q(new WordQuery(s)), use(new size_t(1)) {
    
}

Query::Query(Query_base *query) : q(query), use(new size_t(1)) {
    
}

Query::~Query() {
    decr_use();
}

void Query::decr_use() {
    if (--*use == 0) {
        delete q;
        delete use;
    }
}

set
       
         Query::eva l(const TextQuery &t) const{
    return q->eva l(t);
}

ostream& Query::display(ostream &os) const {
    return q->display(os);
}
       

接下来是最核心的各个查询类Query_base、WordQuery、NotQuery、AndQuery、OrQuery:

Query_base.h

#ifndef __TestC____Query_base__
#define __TestC____Query_base__

#include 
       
        
#include "TextQuery.h"
#include "Query.h"

class Query_base {
    friend class Query;
protected:
    typedef TextQuery::line_no line_no;
    virtual ~Query_base() {}
private:
    virtual set
        
          eva l(const TextQuery&) const = 0; virtual ostream & display(ostream & = cout) const = 0; }; class WordQuery : Query_base { friend class Query; WordQuery(const string &); set
         
           eva l(const TextQuery&) const; ostream & display(ostream & = cout) const; string query_word; }; class NotQuery : public Query_base { friend Query operator~(const Query &); NotQuery(Query); set
          
            eva l(const TextQuery&) const; ostream & display(ostream & = cout) const; const Query query; }; class BinaryQuery : public Query_base { protected: BinaryQuery(Query left, Query right, string op); ostream & display(ostream & = cout) const; const Query lhs, rhs; const string oper; }; class AndQuery : BinaryQuery { friend Query operator&(const Query&, const Query&); AndQuery(Query left, Query right); set
           
             eva l(const TextQuery&) const; }; class OrQuery : BinaryQuery { friend Query operator|(const Query&, const Query&); OrQuery(Query left, Query right); set
            
              eva l(const TextQuery&) const; }; #endif /* defined(__TestC____Query_base__) */
            
           
          
         
        
       

Query_base.cpp

#include "Query_base.h"

/**
 * WordQuery
 */

WordQuery::WordQuery(con
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇poj3267 下一篇杭电1102 Constructing Roads

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: