C++11 无法从const成员函数-Fix8C++中存储私有成员变量中的数据
这是我的标题:C++11 无法从const成员函数-Fix8C++中存储私有成员变量中的数据,c++11,pthreads,fix8,C++11,Pthreads,Fix8,这是我的标题: class my_router_client : public FIX8::my::mine_Router { private: mine_session_client& _session; mutable std::vector<std::string> vSymbolList; public: my_router_client(mine_session_client& session) : _session(sessio
class my_router_client : public FIX8::my::mine_Router {
private:
mine_session_client& _session;
mutable std::vector<std::string> vSymbolList;
public:
my_router_client(mine_session_client& session) : _session(session) {}
virtual bool operator() (const FIX8::my::SecurityList *msg) const;
void sendToServer(FIX8::Message *);
void logout();
void itertool() const;
};
我可以打印内容。这是线程内部的某种竞争条件吗
这是安全列表响应处理程序
bool cx_router_client::operator() (const CX::SecurityList *msg) const
{
GroupBase *dad(msg->find_group< CX::SecurityList::NoRelatedSym >());
if (dad) {
for (size_t cnt(0); cnt < dad->size(); ++cnt) {
CX::Symbol symbol;
MessageBase *details(dad->get_element(cnt));
details->get(symbol);
string ss;
ss = symbol();
vSymbolList.push_back(ss);
// cout << "at :: :: " << vSymbolList[cnt] << endl;
}
cout << "no of symbol : " << vSymbolList.size() << endl;
hypersleep<h_seconds>(1);
}
return true;
}
这是itertool方法:
void my_router_client::itertool() const
{
cout << "symbol list vector size inside itertool:: " << vSymbolList.size() << endl;
stringstream ss;
ss << this_thread::get_id();
uint64_t id = stoull(ss.str());
cout << "Thread ID #### " << id << endl;
vector<string>::iterator it = this->vSymbolList.begin();
while (it != vSymbolList.end()) {
cout << *it << endl;
it++;
}
}
我主要是这样使用它们的:
int main()
{
const string conf_file("myfix_client.xml");
unique_ptr<ClientSessionBase> mc(new ClientSession<mine_session_client>(my::ctx(), conf_file, "DLD1"));
mc->start(false, next_send, next_receive, mc->session_ptr()->get_login_parameters()._davi());
hypersleep<h_seconds>(1);
my_router_client *test = new my_router_client(static_cast< mine_session_client& > (*mc->session_ptr()));
hypersleep<h_seconds>(1);
test->sendToServer(makeSecurityListRequest());
hypersleep<h_seconds>(1);
test->itertool();
while(1);
}
您显示的代码中没有任何错误。问题在于itertool,我不能不注意到,您没有显示它,或者调用代码。例如,您确定在调用operator的同一实例上调用itertool吗?打印这两个指针的值以确认。我为您创建了一个fix8标记。@Igor Tandetnik:这有点令人困惑,因为我得到了不同的“this”,例如:对于运算符方法0x276ff18,对于其他方法0x2718810,包括sendToServer和itertool。我添加了虚拟bool操作符const FIX8::CX::TradingSessionStatus*msg const;仅用于测试,它也返回与其他运算符相同的此值。0x276FF18向我的路由器客户端添加副本构造函数,在其上放置断点,尝试找出创建副本的位置和原因。或者,可能存在某种类型的指针转换错误,一个伪指针被转换到我的路由器客户端,并在其上调用一个方法,尽管像这样的野生指针似乎可以工作,而不会立即崩溃,这是一个罕见的巧合。请注意,我对FIX8一无所知,我只是根据您显示的代码和您对症状的描述。
int main()
{
const string conf_file("myfix_client.xml");
unique_ptr<ClientSessionBase> mc(new ClientSession<mine_session_client>(my::ctx(), conf_file, "DLD1"));
mc->start(false, next_send, next_receive, mc->session_ptr()->get_login_parameters()._davi());
hypersleep<h_seconds>(1);
my_router_client *test = new my_router_client(static_cast< mine_session_client& > (*mc->session_ptr()));
hypersleep<h_seconds>(1);
test->sendToServer(makeSecurityListRequest());
hypersleep<h_seconds>(1);
test->itertool();
while(1);
}