代码之家  ›  专栏  ›  技术社区  ›  Ed of the Mountain

C++下注(使用DyjixCasC铸造)返回null?

  •  1
  • Ed of the Mountain  · 技术社区  · 14 年前

    我不明白为什么下面的downcast返回NULL?我在下面粘贴了基类和派生类。

    提前感谢您的任何提示或建议。

    -埃德

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

    提前感谢您的提示和建议,

    -埃德

    3 回复  |  直到 14 年前
        1
  •  12
  •   Alexander Gessler    14 年前

    你路过一个 fes::EventArgs 对象的值,也就是 fes::事件参数 对象。如果要保留多态对象的原始类型,请传递一个指针或(更好)对它们的引用:

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

    请注意 dynamic_cast 投掷 std::bad_cast 如果应用于引用,则为失败。

        2
  •  0
  •   AnT stands with Russia    14 年前

    向上转换返回空指针的唯一方法是将空指针作为转换的参数传递。

    第二种可能性是这种情况是你认为你正在执行 但实际上,这并不是一个向上的预测。您还没有显示任何使用cast调用函数的代码,因此无法说明发生了什么。

    看看你的代码:没有 上抛 在你的代码里。你想做的是 沮丧的 . 传递给函数的参数 按价值 ,这意味着它在这个过程中被切掉了。难怪悲观主义者失败了。它应该失败。必须通过指针或引用传递才能使用 dynamic_cast .

    另外,不要用HTML标签来格式化代码。使用“代码”按钮。

        3
  •  0
  •   Stephane Rolland    8 年前

    dynamic_cast<> 退货 NULL 如果您要强制转换的类型之间不相关,或者您为其提供了一个空指针来强制转换。检查是在运行时对RTTI提供的类型信息执行的,您可以信任它。

    所以只有这两种可能。

    eventArgs不是AtsCommandEventArgs,或者eventArgs引用了NULL。

    像其他人注意到的那样,您通过值传递eventArgs,因此对象的AtsCommandEventArgs部分不会被复制到。正如其他人告诉您的那样,通过指针或引用传递AtsCommandEventArgs。