sdf3fs
2015-05-25 01:16
采纳率: 50%
浏览 10.1k
已采纳

不能实例化抽象类c++问题

#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

跟答案一样,为什么我这个提示错误?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • 知常曰明 2015-05-25 01:29
    已采纳
    • 代码按照代码的格式贴,不然很难看得清楚啊
    • 基本上来说,
    • 1.首先你应该知道抽象类是不能实例化的
    • 2.如果你的抽象类的派生类有任何一个纯虚函数没有实现,那么不管其他做的再多,这个类仍然是一个抽象类、
    3 打赏 评论
  • mywork_wj 2015-05-25 01:51

    你上面没有实现Query_base的纯虚方法,而是直接继承的,可以实现方法在看看吧

    打赏 评论

相关推荐 更多相似问题