#ifndef QUERY
#define QUERY
#include "TextQuery.h"
class Query_base
{
friend class Query;
protected:
typedef TextQuery::line_no line_no;
virtual ~Query_base(){}
private:
virtual set eval(const TextQuery&)const=0;
virtual ostream& display(ostream& =cout)const=0;
};
class Query
{
private:
friend Query operator~(const Query &);
friend Query operator&(const Query &,const Query&);
friend Query operator|(const Query &,const Query&);
Query_base q;
size_t *use;
void decr_use()
{
if(--*use==0)
{delete q;delete use;}
}
Query(Query_base query):q(query),use(new size_t(1)){}
public:
Query(const string &);
Query(const Query &rhs)
{
q=rhs.q;
use=rhs.use;
++*use;
}
Query& operator=(const Query& rhs)
{
decr_use();
q=rhs.q;
use=rhs.use;
++*use;
return *this;
}
~Query()
{
decr_use();
}
set<TextQuery::line_no> eval(const TextQuery &t)const
{
return q->eval(t);
}
ostream& display(ostream &os)const
{
return q->display(os);
}
};
ostream& operator<<(ostream &os,const Query& query)
{
return query.display(os);
}
class WordQuery:public Query_base
{
private:
friend class Query;
WordQuery(const string &s):query_word(s){}
string query_word;
ostream& display(ostream &os)const
{
return os<
}
set eval(const TextQuery &t)const
{
return t.run_query(query_word);
}
};
Query::Query(const string &s)
{
q=new WordQuery(s);
use=new size_t(1);
}
class NotQuery:public Query_base
{
private:
friend Query operator~(const Query &);
Query query;
set eval(const TextQuery &file)const
{
set has_val=query.eval(file);
set ret_line;
for(line_no i=0;i!=file.size();i++)
if(has_val.find(i)==has_val.end())
ret_line.insert(i);
return ret_line;
}
NotQuery(Query q):query(q){}
ostream& display(ostream &os)const
{
return os<<"~("<<query<<")";
}
};
Query operator~(const Query &oper)
{
return new NotQuery(oper);
}
class BinaryQuery:public Query_base
{
protected:
const Query lhs,rhs;
const string oper;
BinaryQuery(Query right,Query left, string op):rhs(right),lhs(left),oper(op){}
ostream &display(ostream &os)
{
return os<<"("<<lhs<<" "<<oper<<" "<<rhs<<")";
}
};
class AndQuery : public BinaryQuery
{
friend Query operator&(const Query&,const Query &);
AndQuery(Query left, Query right):BinaryQuery(left,right,"&"){ }
set<line_no> eval(const TextQuery& file)const;
};
setTextQuery::line_no AndQuery::eval(const TextQuery& file)const
{
set right=rhs.eval(file);
set left=lhs.eval(file);
set ret_lines;
set::const_iterator iter=right.begin();
for(;iter!=right.end();++iter)
if(left.find(*iter)!=left.end())
ret_lines.insert(*iter);
return ret_lines;
}
Query operator&(const Query &lhs,const Query &rhs)
{
return new AndQuery(lhs,rhs);
}
class OrQuery: public BinaryQuery
{
friend Query operator|(const Query&,const Query &);
OrQuery(Query left,Query right):BinaryQuery(left,right,"|"){ }
set<line_no> eval(const TextQuery& file)const
{
set<line_no> right=rhs.eval(file);
set<line_no> left=lhs.eval(file);
set<line_no>::const_iterator iter=right.begin();
for(;iter!=right.end();++iter)
left.insert(*iter);
return left;
}
};
Query operator|(const Query &lhs,const Query &rhs)
{
return new OrQuery(lhs,rhs);
}
#endif
提示错误 1 error C2259: “AndQuery”: 不能实例化抽象类 d:\vsproject\new_query\new_query\query.h 155 1 New_query
错误 2 error C2259: “OrQuery”: 不能实例化抽象类 d:\vsproject\new_query\new_query\query.h 159 1 New_query
跟答案一样,为什么我这个提示错误?