Gegeben folgendes Problem:C++ Multiple Dispatch-
class Instrument {
};
class Guitar : public Instrument {
public:
void doGuitar() const;
};
class Piano : public Instrument {
public:
void doPiano() const;
};
habe ich eine Liste von Zeigern auf Instrument
list<shared_ptr<Instrument>> instruments;
, in denen ich Instrumente über (zum Beispiel) hinzufügen
Guitar myGuitar;
instruments.push_back(make_shared<Guitar>(myGuitar));
Jetzt , Ich möchte über die Liste instruments
iterieren und doPiano()
wenn der curr aufrufen Ent Instrument ist ein Klavier und doGuitar()
wenn es eine Gitarre ist. Diese beiden Funktionen unterscheiden sich sehr und können daher in der Klasse Instrument
nicht abstrakt gemacht werden.
Das Problem ist, dass C++ den Typ der Instrument
nicht zur Laufzeit identifizieren kann, nicht wahr (wegen Einzelversand)? Wie erreiche ich, dass es die Klavier- oder die Gitarrenfunktion in Abhängigkeit vom aktuellen Typ, auf den der Iterator zeigt, aufruft.
Ich würde mich freuen, wenn ich etw. Arbeiten wie diese Pseudo-Code:
list<shared_ptr<Instrument>>::const_iterator it;
if ("current type == Guitar")
(*it)->doGuitar();
else if ("current type == Piano")
(*it)->doPiano();
Ergebnis
Eigentlich lief ich in mehrere Probleme mit meinem Ansatz. Ich habe mit diesem Post viel Refactoring gemacht: How does one downcast a std::shared_ptr?. Vielen Dank an alle für Ihre Hilfe :)
Warum nicht einfach eine virtuelle 'do'-Funktion haben, die das Richtige tut? –
werfen Sie einen Blick auf 'std :: dynamic_pointer_cast'. Dann reiß dein Design auf und fang neu an. Polymorphismus ist nur dann geeignet, wenn alle abgeleiteten Klassen vernünftigerweise die gleiche Schnittstelle teilen können. –
Eigentlich ist mein Beispiel nur ein kleiner Teil meiner "echten" Implementierung. Es gibt mehrere rein virtuelle Funktionen in 'Instrument'. Ich hätte es erwähnen sollen. – Kapa11