2016-03-08 39 views
1

我已經referd到這裏: QuickFix Login Failed due to password missing的quickfix toAdmin添加用戶名,密碼錯誤

這裏: How to make the login part in QuickFIX

在toAdmin添加用戶名和密碼,像下面:

void Application::toAdmin(FIX::Message& message, const FIX::SessionID& sessionID) 
{ 
    if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType)) 
    { 
     FIX44::Logon& logon_message = dynamic_cast<FIX44::Logon&>(message); 
     FIX::Username username = std::string("my_username") ; 
     logon_message.setField(username); 
    } 
} 

這導致gcc 4.8.2編譯錯誤:

錯誤:can not dynamic_cast ?? me ssage? (類型爲FIX :: Message類型)類型FIX44 :: Logon & ??再次(目標沒有指針或引用來完成型)

然後我我的代碼更改爲

FIX44::Logon* logon_message = (FIX44::Logon*)(&message); 
    FIX::Username username = std::string("my_username") ; 
    logon_message->setField(username); 

這個時候,編譯器錯誤:

error: invalid use of incomplete type ??class FIX44::Logon?? 
logon_message->setField(username); 
      ^

我應該怎麼修改,這樣我可以正確設置用戶名和密碼 函數toAdmin? logon_message-> setField(username)有什麼問題; ?

編輯:

根據這個網頁: https://sourceforge.net/p/quickfix/mailman/message/26233433/

以下優良工程對我說:

if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType)) 
{ 
    message.getHeader().setField(553, "XXXXXXXXX"); 
    message.getHeader().setField(554, "yyyyyyyyy"); 
} 
+1

你絕對是在正確的軌道上,只是一些C++指針的東西絆倒你。下面的Waheed Brown的回答可能會讓你直觀。 –

回答

1

你試過

FIX44::Logon* logon_message = dynamic_cast<FIX44::Logon*>(message); 

FIX44::Logon* logon_message = dynamic_cast<FIX44::Logon*>(*(message)); 

FIX44::Logon* logon_message = dynamic_cast<FIX44::Logon*>(&message); 

我想這可能是正確解引用消息的問題。

0

您不需要投射您的訊息。最終你最終調用setField,這是一個可用於基類FIX :: Message的函數。

 void FIXSession::toAdmin(FIX::Message& msg, const FIX::SessionID& sid) 
     { 
      const std::string& field = msg.getHeader().getField(FIX::FIELD::MsgType); 

      if (FIX::MsgType_Logon == field) 
      { 
       FIX::Dictionary dd(m_sessionSettings.get(sid)); 

       if (dd.has(FixSettingUsername)) 
       { 
        FIX::Username username = dd.getString(FixSettingUsername); 
        msg.setField(username); 
       } 
       if (dd.has(FixSettingPassword)) 
       { 
        FIX::Password password = dd.getString(FixSettingPassword); 
        msg.setField(password); 
       } 

       if (dd.has(FIX::SEND_RESETSEQNUMFLAG)) 
       { 
        FIX::ResetSeqNumFlag rsn(dd.getBool(FIX::SEND_RESETSEQNUMFLAG)); 
        msg.setField(rsn); 
       } 
      } 
     } 
相關問題