C++ niedergeschlagen ( mit dynamic_cast ) gibt NULL zurück?
Umgebung: Linux, C++ /Qt 4x
Ich verstehe nicht, warum der folgende niedergeschlagen NULL zurück? Ich klebte Basis-und abgeleitete Klasse weiter unten.
Vielen Dank im Voraus für Tipps oder Anregungen.
-Ed
void MainWindow::onRtledaEventHandler(fes::EventArgs eventArgs)
{
//This cast returns a NULL ?
fes::AtsCommandEventArgs* atsCommandEventArgs = dynamic_cast<fes::AtsCommandEventArgs*>(&eventArgs);
}
///The base class for containing event arguments sent to clients using boost::signals2
class EventArgs
{
public:
EventArgs() {}
EventArgs(RtledaEventType eventType) :
m_eventType(eventType) {}
EventArgs(const EventArgs& eventArgs) :
m_eventType(eventArgs.m_eventType) {}
virtual ~EventArgs() {}
///The type of event this is
RtledaEventType eventType() const { return m_eventType; }
protected:
RtledaEventType m_eventType;
};
//Derived class I am trying to upcast to
class AtsCommandEventArgs : public EventArgs
{
public:
///\param [in] lraddsPacketError LRADDS oacket error structure
///\sa fes::StructPacketStats_t packetStats
AtsCommandEventArgs(fes::AtsCommand atsCommand, std::string messageBuffer, std::string details) :
EventArgs(RtledaEventTypeAtsCommand),
m_atsCommand(atsCommand),
m_messageBuffer(messageBuffer),
m_details(details) {}
AtsCommandEventArgs(const AtsCommandEventArgs& AtsCommandEventArgs) :
EventArgs(AtsCommandEventArgs),
m_atsCommand(AtsCommandEventArgs.m_atsCommand),
m_messageBuffer(AtsCommandEventArgs.m_messageBuffer),
m_details(AtsCommandEventArgs.m_details) {}
AtsCommandEventArgs() {}
~AtsCommandEventArgs() {}
fes::AtsCommand atsCommand() const { return m_atsCommand; }
std::string messageBuffer() const { return m_messageBuffer; }
std::string details() const { return m_details; }
private:
fes::AtsCommand m_atsCommand;
std::string m_messageBuffer;
std::string m_details;
};
Vielen Dank im Voraus für irgendwelche Tipps oder Anregungen,
-Ed
Du musst angemeldet sein, um einen Kommentar abzugeben.
Übergeben Sie eine
fes::EventArgs
Objekt-Wert, was bedeutet, dass es ist einefes::EventArgs
Objekt. Wenn Sie möchten, um die Erhaltung der ursprünglichen Art von polymorphen Objekten, übergeben Sie einen Zeiger oder (besser) einen Verweis zu Ihnen:Beachten Sie, dass
dynamic_cast
wirftstd::bad_cast
im Falle des Scheiterns, wenn Sie angewendet zu verweisen.Die einzige Möglichkeit für eine Verallgemeinerung zurückzukehren null-Zeiger ist, wenn Sie übergeben Sie einen null-Zeiger als argument für die Darsteller.
Die zweite Möglichkeit ist, in diesem Fall ist, dass Sie denken, dass Sie sind die Durchführung einer Verallgemeinerung, während in Wirklichkeit ist es nicht eine Verallgemeinerung. Sie haben nicht gezeigt, jeder code, der die Funktion aufruft mit der Besetzung, also es gibt keine Möglichkeit zu sagen, was passiert ist.
Blick auf den code: es gibt keine Verallgemeinerung in Ihrem code. Was Sie versuchen zu tun, ist ein niedergeschlagen. Und das argument an die Funktion übergeben wird übergeben von Wert, was bedeutet, dass Sie in Scheiben geschnitten in den Prozess. Kein Wunder, dass die niedergeschlagenen ausfällt. Sollte es scheitern. Sie zu Durchlaufen haben, entweder per Zeiger oder Referenz zu verwenden
dynamic_cast
.P. S. nicht verwenden HTML tags zum formatieren von code auf SO. Verwenden Sie die Schaltfläche "Code".
dynamic_cast
entspricht genaustatic_cast
.dynamic_cast
wird einfach nicht kompiliert.dynamic_cast
gibt null-pointer (oder wirft im Fall von Referenzen), wenn die Typen sind Verwandte, aber der dynamische Typ ist falsch und die Laufzeit-cast fehlschlägt.dynamic_cast<>
zurückNULL
wenn die Typen die zwischen Sie wollen die Darsteller sind nicht verwandt, oder wenn Sie einen NULL-Zeiger zu casten. Die Prüfung erfolgt zur Laufzeit, auf die Typ-Informationen Dank der RTTI, und Sie können darauf Vertrauen.Es gibt also diese beiden Möglichkeiten nur.
Entweder eventArgs ist nicht ein AtsCommandEventArgs oder eventArgs Referenzen auf NULL.
Wie andere bemerkt haben, passieren Sie die eventArgs von Wert, also die AtsCommandEventArgs Teil des Objekts ist, nicht kopiert werden. Wie andere gesagt haben, Sie, vorbei an der AtsCommandEventArgs durch Zeiger oder Referenzen.