Wie @David Pierre vorschlägt: find ist wertbasiert: es sucht im Bereich der Iteratoren nach einem Zeiger (z.B. 0x0F234420), der gleich dem Zeiger auf die new Circle(point(1,2),3)
die Sie gerade erstellt haben. Da es sich um ein neues Objekt handelt, wird es nicht vorhanden sein.
Sie können dies umgehen, indem Sie find_if
mit einem Operator, der die Objekte, auf die der Zeiger verweist, vergleicht.
Das Kriterium sollte jedoch in der Lage sein, zwischen den verschiedenen Formen zu unterscheiden.
class Shape {
public:
//amongst other functions
virtual bool equal( const Shape* ) const = 0;
};
class Circle : public Shape {
public:
bool equal( const Shape* pOther ) const {
const Circle* pOtherCircle = dynamic_cast<const Circle*>( pOther );
if( pOtherCircle == NULL ) return false;
// compare circle members
}
};
class Rectangle : public Shape {
public:
bool equal( const Shape* pOther ) const {
const Rectangle* pOtherR = dynamic_cast<const Rectangle*>( pOther );
if( pOtherR == NULL ) return false;
// compare rectangle members
}
};
Shape* pFindThis = new Circle(point(1,2),3);
vector<Shape*>::const_iterator itFound = find_if(s1.begin(),s1.end(),
bind1st( mem_fun( &Shape::equal ), pFindThis) ) );
delete pFindThis; //leak resolved by Mark Ransom - tx!
if( itFound != s1.end() ) {
(*itFound)->move(point(10,20));
}