Class 前向声明 libtorrent
Class forward declaration libtorrent
我如何正确转发声明一个class?
//client_functions.cpp
using namespace libtorrent;
session Sess;
bool Start_Client_Sess( )
{
Sess.add_extension ( create_ut_pex_plugin );
Sess.add_extension ( create_ut_metadata_plugin );
Sess.add_extension ( create_lt_trackers_plugin );
Sess.add_extension ( create_smart_ban_plugin );
Sess.start_upnp( );
Sess.start_natpmp( );
Sess.start_dht( );
Sess.start_lsd( );
error_code e;
Sess.listen_on ( std::make_pair ( 6881 , 6889 ) , e );
if ( e )
{
#ifdef DEBUG_CONSOLE
std::cout << "Start Client failed\n";
#endif
return false;
}
return true;
}
我遇到的问题是代码是如何只有一个 Sess
的,这就是它需要的方式,就好像在每个客户端函数中都声明了 session Sess;
创建了一个新会话但是现在由于 session Sess;
在函数外部声明,因此应用程序无法正常关闭,因为 Sess
有自己的线程,并且从第二次调用应用程序获取命令行参数会导致第二个实例挂起。
我想我需要 session Sess;
才能在 _tWinMain
中,但是把它放在那里会让我在 client_functions.cpp
上出错,而它抱怨 Sess
未定义。
不是声明 session Sess
,而是声明 session *Sess
。这样你就可以从你的函数中控制 Sess
的生命周期。您可以在例如main()
并在最后执行的函数中销毁它。要创建它,请执行 Sess = new session;
并要销毁它,请执行 delete Sess;
.
缺点是您必须 search/replace 所有 Sess.
和 Sess->
。
顺便说一句,使用 extern
来引用全局变量更合适,例如extern session *Sess
在除实际声明它的文件之外的每个文件中(可能是创建它的文件,例如来自 main()
.
听起来您希望多个翻译单元共享一个全局 session
实例。你可以做的是,在一个翻译 unit/cpp 文件中 define Sess,像这样(假设这是你的 main.cpp):
libtorrent::session Sess;
在其头文件(main.hpp)中,包括:
extern libtorrent::session Sess;
在任何其他要使用session的翻译unit/cpp文件中,确保包含头文件(main.hpp),然后就可以使用main.cpp创建的实例
我如何正确转发声明一个class?
//client_functions.cpp
using namespace libtorrent;
session Sess;
bool Start_Client_Sess( )
{
Sess.add_extension ( create_ut_pex_plugin );
Sess.add_extension ( create_ut_metadata_plugin );
Sess.add_extension ( create_lt_trackers_plugin );
Sess.add_extension ( create_smart_ban_plugin );
Sess.start_upnp( );
Sess.start_natpmp( );
Sess.start_dht( );
Sess.start_lsd( );
error_code e;
Sess.listen_on ( std::make_pair ( 6881 , 6889 ) , e );
if ( e )
{
#ifdef DEBUG_CONSOLE
std::cout << "Start Client failed\n";
#endif
return false;
}
return true;
}
我遇到的问题是代码是如何只有一个 Sess
的,这就是它需要的方式,就好像在每个客户端函数中都声明了 session Sess;
创建了一个新会话但是现在由于 session Sess;
在函数外部声明,因此应用程序无法正常关闭,因为 Sess
有自己的线程,并且从第二次调用应用程序获取命令行参数会导致第二个实例挂起。
我想我需要 session Sess;
才能在 _tWinMain
中,但是把它放在那里会让我在 client_functions.cpp
上出错,而它抱怨 Sess
未定义。
不是声明 session Sess
,而是声明 session *Sess
。这样你就可以从你的函数中控制 Sess
的生命周期。您可以在例如main()
并在最后执行的函数中销毁它。要创建它,请执行 Sess = new session;
并要销毁它,请执行 delete Sess;
.
缺点是您必须 search/replace 所有 Sess.
和 Sess->
。
顺便说一句,使用 extern
来引用全局变量更合适,例如extern session *Sess
在除实际声明它的文件之外的每个文件中(可能是创建它的文件,例如来自 main()
.
听起来您希望多个翻译单元共享一个全局 session
实例。你可以做的是,在一个翻译 unit/cpp 文件中 define Sess,像这样(假设这是你的 main.cpp):
libtorrent::session Sess;
在其头文件(main.hpp)中,包括:
extern libtorrent::session Sess;
在任何其他要使用session的翻译unit/cpp文件中,确保包含头文件(main.hpp),然后就可以使用main.cpp创建的实例