Problem mit virtueller Klasse

17/09/2014 - 13:20 von da_lodda | Report spam
Hallo,

ich möchte etwas Kompliziertes machen und komme
nicht so recht weiter:

Von einer Basisklasse möchte ich verschiedene
Klassen ableiten und die mit "new" einstandenen
Pointer in einem std::vector speichern. Dazu
nehme ich einen shared pointer, damit im Destruktor
des vectors die Objekte zerstört werden.

Ich habe also:

class base
{
} ;

class derived1 : public base
{
}

class derived2 : public base
{
}

und

std::vector <boost::shared_ptr <base> > array ;

und speichere z. B.

array.push_back(boost::shared_ptr <derived1> (new derived1)) ;


Jetzt möchte ich die std::vector-Funktionen nutzen,
z. B. find. Dazu brauche ich einen == operator, der
mit meinen Pointern funktioniert, denn jeder abgeleitete
Typ hat natürlich einen eigenen == operator.

Wie kriegt man das hin?
Ich habe schon mit virtuellen == operatoren
experimentiert, aber mit den shared pointern klappt es nicht.
 

Lesen sie die antworten

#1 Daniel Krügler
19/09/2014 - 20:35 | Warnen spam
Am Mittwoch, 17. September 2014 13:20:55 UTC+2 schrieb :

ich möchte etwas Kompliziertes machen und komme
nicht so recht weiter:

Von einer Basisklasse möchte ich verschiedene
Klassen ableiten und die mit "new" einstandenen
Pointer in einem std::vector speichern. Dazu
nehme ich einen shared pointer, damit im Destruktor
des vectors die Objekte zerstört werden.

Ich habe also:

class base
{
} ;



Stark empfehlenswert in dieser Situation ist, dass die Basisklasse einen virtuellen Destruktor hat. Dieser Rat hàngt aber nicht mit deiner Frage zusammen.

std::vector <boost::shared_ptr <base> > array ;

und speichere z. B.

array.push_back(boost::shared_ptr <derived1> (new derived1)) ;

Jetzt möchte ich die std::vector-Funktionen nutzen,

z. B. find.



std::vector hat keine find-Funktion. Es gibt allerdings ein freies Funktionstemplate find bzw. find_if aus <algorithm>:

template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last,
const T& value);
template<class InputIterator, class Predicate>
InputIterator find_if(InputIterator first, InputIterator last,
Predicate pred);

Dazu brauche ich einen == operator, der

mit meinen Pointern funktioniert, denn jeder abgeleitete

Typ hat natürlich einen eigenen == operator.



OK, soweit klar.

Wie kriegt man das hin?



Verwende std::find_if, da kannst du ein Predikat angeben. Als Ersatz zu operator== bietet sich das ebenfalls freie Funktionstemplate

template <class InputIterator1, class InputIterator2, class BinaryPredicate>
bool equal(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, BinaryPredicate pred);

Besten Gruss aus Bremen,

- Daniel Krügler

Ähnliche fragen