Question

Environnement: Linux C ++ / Qt 4x

Je ne comprends pas pourquoi le retourne NULL baissés suivant? Je la base et la classe dérivée collé ci-dessous.

Merci d'avance pour des conseils ou des suggestions.

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

Merci à l'avance pour des conseils ou des suggestions,

-Ed

Était-ce utile?

La solution

Vous passez un objet fes::EventArgs par valeur, ce qui signifie que un objet fes::EventArgs. Si vous souhaitez conserver le type d'origine des objets polymorphes, passer un pointeur ou (mieux) une référence à:

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

Notez que dynamic_cast lance std::bad_cast en cas d'échec si elle est appliquée à des références.

Autres conseils

La seule façon pour un upcast null-pointeur de retour est lorsque vous passez un pointeur NULL comme argument pour la distribution.

La deuxième possibilité est que ce cas est votre pensent que vous effectuez une upcast , alors qu'en réalité il n'est pas un upcast. Vous avez montré aucun code qui appelle la fonction avec le casting, donc il n'y a aucun moyen de dire ce qui se passe là-bas.

En regardant votre code: il n'y a pas upcast dans votre code. Ce que vous essayez de faire est baissés . Et l'argument que vous avez passé à la fonction est passée par la valeur , ce qui signifie qu'il a obtenu en tranches dans le processus. Pas étonnant que le baissés échoue. Il devrait échouer. Vous devez passer soit par pointeur ou par référence à l'utilisation dynamic_cast.

P.S. Ne pas utiliser des balises HTML au code de format sur le SO. Utilisez le bouton "Code".

retourne dynamic_cast<> NULL si les types entre vous sont désireux de fonte ne sont pas liés, ou si vous avez fourni un pointeur NULL à lancer. La vérification est effectuée lors de l'exécution, sur les informations de type fournies grâce à la RTTI, et vous pouvez faire confiance.

Alors il y a ces deux possibilités seulement.

Soit eventArgs n'est pas une ou références AtsCommandEventArgs eventArgs un NULL.

Comme d'autres l'ont remarqué, vous passez les eventArgs en valeur, de sorte que la partie AtsCommandEventArgs de l'objet n'est pas copié. Comme d'autres vous ont dit, passer les AtsCommandEventArgs par pointeur ou par des références.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top