C++ 快速修复要添加用户名、密码的管理员错误
我在这里提到: 在这里: 要在管理员中添加用户名和密码,请执行以下操作:C++ 快速修复要添加用户名、密码的管理员错误,c++,quickfix,C++,Quickfix,我在这里提到: 在这里: 要在管理员中添加用户名和密码,请执行以下操作: void Application::toAdmin( FIX::Message& message, const FIX::SessionID& sessionID) { if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType)) { FIX44::Logon& logon
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 );
}
}
这一次,编译器再次出错:
error: invalid use of incomplete type ??class FIX44::Logon??
logon_message->setField( username );
^
我应该修改什么以便在中正确设置用户名和密码
功能到管理员?登录消息->设置字段(用户名)有什么问题
编辑:
根据本网页:
以下几点对我来说很好:
if (FIX::MsgType_Logon == message.getHeader().getField(FIX::FIELD::MsgType))
{
message.getHeader().setField(553, "XXXXXXXXX");
message.getHeader().setField(554, "yyyyyyyyy");
}
你试过了吗
FIX44::Logon* logon_message = dynamic_cast<FIX44::Logon*>(message);
FIX44::Logon*Logon\u message=dynamic\u cast(message);
或
FIX44::Logon*Logon\u message=dynamic\u cast(*(message));
或
FIX44::Logon*Logon\u message=dynamic\u cast(&message);
我认为这可能是一个正确取消引用消息的问题。您不需要发布消息。最终,您将调用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);
}
}
}
错误消息表明您没有
#包括“quickfix/fix44/Logon.h”
这就是为什么它认为您使用的是不完整类型。您的编译器现在可能只看到一个声明的转发:classfix44::Logon它不知道这个类包含什么方法
其他答案正确地表明,你甚至不需要沮丧
message.setField(FIX::Username(username));
message.setField(FIX::Password(password));
你肯定是在正确的轨道上,只是一些C++指针把你绊倒了。下面瓦希德·布朗的回答可能会让你明白。
FIX44::Logon* logon_message = dynamic_cast<FIX44::Logon*>(&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);
}
}
}
message.setField(FIX::Username(username));
message.setField(FIX::Password(password));