for_each Algorithmus mit Polymorphie
-
Hallo,
ich habe ein paar Listen mit verschiedenen Zeigern auf Klassen, die alle von einer Basisklasse abgeleitet sind.
z.B.: std::list<Abgeleitet*>
Nun möchte ich den for_each Algorithmus auf jede dieser Listen anwenden, um damit eine Funktion aus der Basisklasse aufzurufen.for_each(list.begin(), list.end(), execute)
execute sieht dabei folgendermaßen aus
void execute (Basis& bas)
{
bas.printStats();
}Obiges ist natürlich falsch, da meine Listen Zeiger enthalten, also müßte ich schonmal die Adresse eines Zeigers entgegennehmen und dann damit irgendwie printStats() aufrufen - aber wie? Irgendwie bekomm ich es nicht hin. Ich fühl mich wie ein Zeigernoob!
-
Hi!
Statt & ein *, da du einen Zeiger übergibst und statt base. machst du base->, da du zuvor dereferenzieren musst.
Code-Hacker
-
Also ich hab noch nie for_each benutzt aber könnte es denn nicht so gehen:
std::list<Abgeleitet*> list; /* ... */ for_each(list.begin(), list.end(), execute) void execute (Basis* bas) { bas->printStats(); }
-
Geht leider nicht, da der Funktionsparameter die Adresse des Wertes sein muß. Also die Adresse des Zeigers.
-
Schonmal Basis*& versucht?
-
Hi!
Adresse von Wert und Adresse von Zeiger der auf den Speicherbereich des Wertes zeigt ist was anderes. Wenn du an Base* bas übergibst, dann wird die Adresse des Wertes übergeben. Wenn du an Base** bas übergibst dann die Adresse des Zeigers.
Code-Hacker
-
DerBenutzer schrieb:
Geht leider nicht, da der Funktionsparameter die Adresse des Wertes sein muß. Also die Adresse des Zeigers.
Sorry, das leuchtet mir nicht ein. Hab mal schnell nach for_each gegoogelt und da steht folgendes:
The algorithm std::for_each() applies a function to all elements in a collection. This algorithm takes three arguments: the first two provide the iterators that describe the sequence to be evaluated, and the third is a one-argument function. The algorithm std::for_each() applies the function to each value of the sequence, passing the value as an argumentfor_each müsste also deine Funktion für jedes Element in dem Container aufrufen und in deinem Container befinden sich nun mal Zeiger auf Abgeleitet.
Ich bleib dabei und sag weiterhin, dass "void execute (Basis* bas) " richtig ist. :p
-
Also mein compiler schluckt
void execute (Basis* bas)
und
void execute (Basis*&bas)
(Was bei templates ja eigentlich ja auch zu erwachten war)
Was Probleme machen könnte wäre wenn dein container const ist.
-
Hallo,
ich habe das Problem jetzt gelöst, der polymorphische Funktionsaufruf war letzendlich das Problem. Also habe ich eine Template Funktion geschrieben, die mit den verschiedenen abgeleiteten Klassen instanziert werden kann.