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