سؤال

البيئة: Linux C ++ / QT 4x

أنا لا أفهم لماذا يعود الإرجاع التالي الفارغ؟ لقد لصق القاعدة والفئة المشتقة أدناه.

شكرا مقدما على أي نصائح أو اقتراحات.

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

شكرًا مقدمًا على أي نصائح أو اقتراحات ،

-ed

هل كانت مفيدة؟

المحلول

أنت تمر fes::EventArgs الكائن حسب القيمة ، مما يعني ذلك هو أ fes::EventArgs هدف. إذا كنت ترغب في الحفاظ على النوع الأصلي من الكائنات المتعددة الأشكال ، فمرر مؤشرًا أو (أفضل) مرجع إليهم:

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

لاحظ أن dynamic_cast رميات std::bad_cast في حالة الفشل إذا تم تطبيقه على المراجع.

نصائح أخرى

الطريقة الوحيدة لإرجاع البث المترجم هي عندما تمر بمؤشر فارغ كوسيطة للممثلين.

الاحتمال الثاني هو أن هذه الحالة هي أن تفكر في أنك تؤدي المهوى الصاعد, ، في حين أنه في الواقع ليس بمثابة. لم تعرض أي رمز يستدعي الوظيفة باستخدام الممثلين ، لذلك لا توجد طريقة لقول ما يحدث هناك.

النظر إلى الكود الخاص بك: لا يوجد المهوى الصاعد في الكود الخاص بك. ما تحاول القيام به هو مسبل. يتم تمرير الحجة التي انتقلت إلى الوظيفة بالقيمة, ، مما يعني أنه حصل على شرائح في هذه العملية. لا عجب أن الفشل الفاشل. يجب أن تفشل. عليك أن تمر إما عن طريق المؤشر أو بالرجوع إلى الاستخدام dynamic_cast.

PS لا تستخدم علامات HTML لتنسيق الرمز على SO. استخدم زر "الرمز".

dynamic_cast<> عائدات NULL إذا كانت الأنواع بينك التي ترغب في الإلقاء هي غير ذات صلة ، أو إذا كنت قد قدمت ذلك مؤشرًا فارغًا. يتم إجراء فحص في وقت التشغيل ، على معلومات النوع المقدمة بفضل RTTI ، ويمكنك الوثوق بها.

لذلك هناك احتمالان فقط.

أي من EventArgs ليسوا ATSCommandeventArgs أو eventArgs المراجع A to null.

مثل الآخرين لاحظوا ، يمكنك تمرير EventArgs حسب القيمة ، لذلك لم يتم نسخ جزء AtscommandeventArgs من الكائن. كما أخبرك آخرون ، تمرير AtscommandeventArgs بواسطة المؤشر أو المراجع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top