Shared-Pointer-Problem

18/09/2014 - 10:26 von lothar.frings | 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 Lars Tetzlaff
20/09/2014 - 19:46 | Warnen spam
Am 18.09.2014 um 10:26 schrieb :


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.



Benutze find_if:

bool testfunc(const boost::shared_ptr <base>& val )
{
return true; // wenn val dem Testkriterium entspricht
}

std::vector <boost::shared_ptr <base> >::iterator iter = std::find_if(
array.begin(), array.end(), &testfunc);


Du kannst statt der Funktion auch einen Funktor oder mit C++11 einen
Lambdaausdruck verwenden.

Ähnliche fragen