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

不能实例化抽象类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.如果你的抽象类的派生类有任何一个纯虚函数没有实现,那么不管其他做的再多,这个类仍然是一个抽象类、
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值