[완료]stl의 remove_if가 virtual function을 먹지 않습니다.
글쓴이: sell / 작성시간: 수, 2010/03/17 - 4:39오전
#include <iostream> #include <list> using namespace std; // a predicate implemented as a class: class is_base { public: virtual bool operator() (const int& value) { return true; } }; class is_even : public is_base { public: virtual bool operator() (const int& value) {return (value%2)==0; } }; int main () { int myints[]= {1,2,3,4,5,6,7,8, 9, 10, 11, 12, 13,14, 15,16, 17, 18}; list<int> mylist (myints,myints+18); is_base* pt_base = new is_even; mylist.remove_if (*pt_base); cout << "mylist contains:"; for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it) cout << " " << *it; cout << endl; return 0; }
제 생각이 이렇게 하면 is_even의 operator()가 실행되서 even이 지워져 홀수만 남아있어야 할 것 같은데,
자꾸 is_base의 ()가 실행되서 다 지워지네요.
문제가 뭐죠?
Forums:
*pt_base가 값으로 전달되기 때문입니다.
http://www.cplusplus.com/reference/stl/list/remove_if/
:)
*pt_base가 값으로 전달되기 때문입니다.
http://www.cplusplus.com/reference/stl/list/remove_if/
:)
void remove_if(is_base p);
void remove_if(is_base p);
형태의 함수가 생성되서 실행되기 때문입니다.mylist.remove_if<is_base&>(*pt_base);
로 레퍼런스를 인자로 받는 함수로 명시화해서 실행시키면 의도하신대로 돌아갈거예요.댓글 달기