find_if无法应付动多态

excited_lamb 2010-09-21 12:21:56
还得自己写一个,不知道是否合适这样。顺便问下大家应付多种方式查询,或者排序会设计

class QueryStudent
{
public:
void query()
{
list<Student>& L = g_SCDataBase.get_StudentList();

list<Student>::iterator a = L.begin();
list<Student>::iterator b = L.end();
list<Student>::iterator it;

while((it = find_if(a, b, this)) != b)
{
m_Result.push_back(*it);
a = ++it;
}
}
list<Student>& get_Result() { return m_Result; }

protected:
virtual bool operator()(const Student& s) = 0;

private:
template<typename Iterator, typename Pred>
Iterator find_if(Iterator first, Iterator last, Pred* cmp)
{
for (; first != last; ++first)
if ((*cmp)(*first))
break;
return first;
}

protected:
list<Student> m_Result;
};

class QueryByName : public QueryStudent
{
public:
QueryByName(string name)
: m_Name(name) { }

virtual bool operator()(const Student& s)
{
return s.get_name() == m_Name;
}

private:
string m_Name;
};

class QueryByNumber : public QueryStudent
{
public:
QueryByNumber(const string number)
: m_Number(number) { }

virtual bool operator()(const Student& s)
{
return s.get_number() == m_Number;
}
private:
string m_Number;
};
...全文
110 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
rach09 2010-09-21
  • 打赏
  • 举报
回复
看的有点晕,要用多数人用的习惯……呵,jf
wokonglinglude 2010-09-21
  • 打赏
  • 举报
回复
没弄清楚你的问题 不好意思 楼上的帖子作废
wokonglinglude 2010-09-21
  • 打赏
  • 举报
回复
应该问题不大 还是要注意 把类定义 个实现分开的好 我看类成员就挺累的了!!! 还要理清你的关系
你试着只简单声明 然后再定义吧 那是个好习惯,求分
healer_kx 2010-09-21
  • 打赏
  • 举报
回复
函数对象里面做事情。
taodm 2010-09-21
  • 打赏
  • 举报
回复
呃,effective c++第三版item35
Jim_King_2000 2010-09-21
  • 打赏
  • 举报
回复
你一个类既做查询,又做predicate,把两个不相关的功能揉到了一起,才导致find_if不适用的情况。
查询的代码与predicate不要写在一起。分开写。


class QueryStudent;

class NamePredicate;
class NumberPredicate;

excited_lamb 2010-09-21
  • 打赏
  • 举报
回复
find_if第3个参数,就是它的比较函数,是按值传递的。

如果我想这样的话
class CmpFuntor
{
public:
//virtual bool operator()(const Object& o) = 0;这样的话更不就不能传给find_if
virtual bool operator()(const Object& o)
{
return false;
}
};

class CmpObj : public CmpInerface {};


find_if(begin, end, new CmpObj);//这样不能达到我要的效果

改成这样实现就可以了
template<typename Iterator, typename Pred>
Iterator find_if(Iterator first, Iterator last, Pred* cmp)
{
for (; first != last; ++first)
if ((*cmp)(*first))
break;
return first;
}



taodm 2010-09-21
  • 打赏
  • 举报
回复
find_if无法应付动多态是怎么个无法啊?

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧