C++ Primer 第四版文本查询示例的问题

z930618 2013-02-18 12:37:17
class Query {
// these operators need access to the Query_base* constructor
friend Query operator~(const Query &);
friend Query operator|(const Query&, const Query&);
friend Query operator&(const Query&, const Query&);
public:
Query(const std::string&); // builds a new WordQuery

// copy control to manage pointers and use counting
Query(const Query &c): q(c.q), use(c.use) { ++*use; }
~Query() { decr_use(); }
Query& operator=(const Query&);

// interface functions: will call corresponding Query_base operations
std::set<TextQuery::line_no>
eval(const TextQuery &t) const { return q->eval(t); }
std::ostream &display(std::ostream &os) const
{ return q->display(os); }
private:
Query(Query_base *query): q(query),
use(new std::size_t(1)) { }
Query_base *q;
std::size_t *use;
void decr_use()
{ if (--*use == 0) { delete q; delete use; } }
};

class NotQuery: public Query_base {
friend Query operator~(const Query &);
NotQuery(Query q): query(q) { }

// concrete class: NotQuery defines all inherited pure virtual functions
std::set<line_no> eval(const TextQuery&) const;
std::ostream& display(std::ostream &os) const
{ return os << "~(" << query << ")"; }
const Query query;
};

class BinaryQuery: public Query_base {
protected:
BinaryQuery(Query left, Query right, std::string op):
lhs(left), rhs(right), oper(op) { }

// abstract class: BinaryQuery doesn't define eval
std::ostream& display(std::ostream &os) const
{ return os << "(" << lhs << " " << oper << " "
<< rhs << ")"; }

const Query lhs, rhs; // right- and left-hand operands
const std::string oper; // name of the operator
};

class AndQuery: public BinaryQuery {
friend Query operator&(const Query&, const Query&);
AndQuery(Query left, Query right):
BinaryQuery(left, right, "&") { }

// concrete class: AndQuery inherits display and defines remaining pure virtual
std::set<line_no> eval(const TextQuery&) const;
};

class OrQuery: public BinaryQuery {
friend Query operator|(const Query&, const Query&);
OrQuery(Query left, Query right): BinaryQuery(left, right, "|") { }

// concrete class: OrQuery inherits display and defines remaining pure virtual
std::set<line_no> eval(const TextQuery&) const;
};

inline Query operator&(const Query &lhs, const Query &rhs)
{
return new AndQuery(lhs, rhs);
}

inline Query operator|(const Query &lhs, const Query &rhs)
{
return new OrQuery(lhs, rhs);
}

inline Query operator~(const Query &oper)
{
return new NotQuery(oper);



这上面把~|&设为友元说是会用到
Query(Query_base *query): q(query),
use(new std::size_t(1)) { }
这个构造函数,但是我怎么都看不出有用到这个构造函数。
求解……
...全文
188 10 点赞 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
杨过的左手 2013-04-01
inline Query operator&(const Query& lhs, const Query& rhs) { return new AndQuery(lhs, rhs); } inline Query operator|(const Query& lhs, const Query& rhs) { return new OrQuery(lhs, rhs); } inline Query operator~(const Query& oper) { return new NotQuery(oper); } 再看看这几个函数的new 和 return
  • 打赏
  • 举报
回复
杨过的左手 2013-04-01
如果没有这个构造函数,那set<TextQuery::line_no> eval(const TextQuery& t)const 这个函数的形参如何传进去呢?
  • 打赏
  • 举报
回复
yubao669016 2013-04-01
构造函数设为私有函数了一般不能实例化,工程上有一种叫做什么‘例’的用法
  • 打赏
  • 举报
回复
z930618 2013-02-28
……时隔10天,再来求解
  • 打赏
  • 举报
回复
z930618 2013-02-18
我把这个构造函数注释掉之后编译出来的错误是这个 error C2664: “Query::Query(const std::string &)”: 不能将参数 1 从“AndQuery *”转换为“const std::string &” 1> 原因如下: 无法从“AndQuery *”转换为“const std::string” 1> 无构造函数可以接受源类型,或构造函数重载决策不明确 error C2664: “Query::Query(const std::string &)”: 不能将参数 1 从“OrQuery *”转换为“const std::string &” 1> 原因如下: 无法从“OrQuery *”转换为“const std::string” 1> 无构造函数可以接受源类型,或构造函数重载决策不明确 error C2664: “Query::Query(const std::string &)”: 不能将参数 1 从“NotQuery *”转换为“const std::string &” 1> 原因如下: 无法从“NotQuery *”转换为“const std::string” 1> 无构造函数可以接受源类型,或构造函数重载决策不明确 确实用到了……但是我就是不知道到底怎么用了
  • 打赏
  • 举报
回复
z930618 2013-02-18
引用 1 楼 ganpengjin1 的回复:
引用 楼主 z930618 的回复:class Query { // these operators need access to the Query_base* constructor friend Query operator~(const Query &amp;); friend Query operator|(const Query&amp;……
这个构造函数是private的啊……如果有用到肯定在定义里的。
  • 打赏
  • 举报
回复
漫步者、 2013-02-18
引用 楼主 z930618 的回复:
class Query { // these operators need access to the Query_base* constructor friend Query operator~(const Query &); friend Query operator|(const Query&, const Query&); frie……
上面都是定义,可能在你的主函数中使用了对象的位操作。你仔细再看看
  • 打赏
  • 举报
回复
z930618 2013-02-18
引用 5 楼 ganpengjin1 的回复:
引用 3 楼 z930618 的回复:我把这个构造函数注释掉之后编译出来的错误是这个 error C2664: “Query::Query(const std::string &amp;)”: 不能将参数 1 从“AndQuery *”转换为“const std::string &amp;” 1> 原因如下: 无法从“AndQuery……
不是……我是把那个构造函数注释掉才出错误的,我只是想知道那个构造函数到底用在哪了,怎么用的……
  • 打赏
  • 举报
回复
漫步者、 2013-02-18
引用 3 楼 z930618 的回复:
我把这个构造函数注释掉之后编译出来的错误是这个 error C2664: “Query::Query(const std::string &)”: 不能将参数 1 从“AndQuery *”转换为“const std::string &” 1> 原因如下: 无法从“AndQuery *”转换为“const std::string” ……
你的看看你在构造对象的时候,传入的参数是否正确
  • 打赏
  • 举报
回复
z930618 2013-02-18
求解……求不沉
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2013-02-18 12:37
社区公告
暂无公告