Domanda

Ambiente: Linux C ++ / Qt 4x

Non capisco il motivo per cui i seguenti rendimenti bassi NULL? Ho incollato base e classe derivata sotto.

Grazie in anticipo per eventuali consigli o suggerimenti.

-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;
};

Grazie in anticipo per eventuali consigli o suggerimenti,

-Ed

È stato utile?

Soluzione

Si sta passando un oggetto fes::EventArgs per valore, il che significa che è un oggetto fes::EventArgs. Se si desidera conservare il tipo originale di oggetti polimorfici, passare un puntatore o (meglio) un riferimento ad essi:

void MainWindow::onRtledaEventHandler(fes::EventArgs& eventArgs) {
   fes::AtsCommandEventArgs& atsCommandEventArgs = dynamic_cast< fes::AtsCommandEventArgs&>(eventArgs);
}

Si noti che dynamic_cast getta std::bad_cast in caso di guasto, se applicata a riferimenti.

Altri suggerimenti

L'unico modo per un upcast al ritorno null-pointer è quando si passa un null-pointer come un argomento per il cast.

La seconda possibilità è questo caso è che il vostro stanno pensando che si sta eseguendo un upcast , mentre in realtà non è un upcast. Non hai mostrato alcun codice che chiama la funzione con il cast, quindi non c'è modo di dire quello che sta succedendo lì.

Guardando il codice: non c'è upcast nel codice. Quello che si sta cercando di fare è un abbattuto . E l'argomento è stato passato alla funzione viene passata per valore , il che significa che ha ottenuto tagliati nel processo. Nessuna meraviglia che il depresso non riesce. Si dovrebbe fallire. Devi passare sia da puntatore o con riferimento ad uso dynamic_cast.

P.S. Non utilizzare i tag HTML per codice del formato su SO. Utilizzare il pulsante "Codice".

restituisce dynamic_cast<> NULL se i tipi tra si vogliono fusione sono estranei, o se è stato fornito un puntatore NULL al cast. Il controllo viene eseguito in fase di esecuzione, sul tipo di informazioni fornite grazie alla RTTI, e ci si può fidare.

Quindi c'è solo queste due possibilità.

Sia eventArgs non è un AtsCommandEventArgs o eventArgs riferimento a un NULL.

Come altri hanno notato, si passa le eventArgs per valore, per cui la parte AtsCommandEventArgs dell'oggetto non viene copiato. Come altri hanno detto, passare i AtsCommandEventArgs dal puntatore o da riferimenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top