我在静态库中有一个类,如下所示:
connection.h
struct impl;
class connection
{
public:
connection(boost::asio::io_service & io_service, std::string host, int port, std::string login_id, std::string authentication);
~connection();
void initialize();
private:
//SFL::IO::SFIOManagerPtr* m_io_manager;
//SFL::MSG::SFProtocolPtr* m_protocol;
void timer_callback(const boost::system::error_code& error);
impl* _impl;
};
构造函数:
connection::connection(boost::asio::io_service & io_service, std::string host, int port, std::string login_id, std::string authentication)
{
_impl = new impl(io_service);
_impl->_host = host;
_impl->_port = port;
//m_io_manager = new SFL::IO::SFIOManagerPtr(new SFL::IO::SFIOManager());
_impl->_endpoint = new customendpoint(ST_API_SERVER, 0, login_id, authentication);
std::cout << "connection" << std::endl;
}
然后我从.exe中使用它:
boost::asio::io_service io_service;
snap::external_api::connection *conn = new snap::external_api::connection(io_service, "10.1.1.74", 5091, "mdl", "mdl");
//At this point, connection->_impl is initialized and valid.
conn->initialize();
//But here, when I go into connection::initialize(), the _impl member is null.
问题出在最后一个代码示例的注释中。在构造函数之后,conn
的成员是有效的。但是当控件进入connection::initialize()
时,成员(_impl
)变为NULL
。为什么会这样?
编辑:
class customendpoint : public SNClientEndpoint
{
public:
customendpoint(int type, int tc, std::string loginId, std::string auth)
:SNClientEndpoint(type, tc, loginId, auth)
{
}
void OnOpen(const SFL::SFErrorCode& ec, bool& startRead)
{
Login();
}
};
struct connection_settings
{
char type;
std::string address;
int id_type;
std::string login_id;
std::string authentication;
};
struct impl
{
int _client_type;
customendpoint* _endpoint;
bool _enabled;
boost::asio::io_service& _io_service;
connection_settings _conn_settings;
boost::asio::deadline_timer _timer;
std::string _host;
int _port;
impl(boost::asio::io_service& io_service)
:_io_service(io_service), _timer(io_service)
{
}
};
initialize()
函数:
void connection::initialize()
{
SFL::MSG::SFProtocolPtr protocol(new protocol_type()); /// protocol for DBAccess thread handler
snap::ctrl::consumer::SNControl *control = new snap::ctrl::consumer::SNControl();
control->Initialize(protocol);
_impl->_endpoint->SetProtocol(protocol);
}