类转发声明libtorrent

Class forward declaration libtorrent

本文关键字:libtorrent 声明 转发      更新时间:2023-10-16

如何正确地转发声明一个类?

//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 failedn";
        #endif
        return false;
    }
    return true;
}

我遇到的问题是,代码是如何存在的——只有一个Sess,这就是为什么它需要像在每个客户端函数中声明session Sess;一样创建一个新会话,但现在由于session Sess;是在函数之外声明的,因此应用程序无法正常关闭,因为Sess有自己的线程,并且从对应用程序的第二次调用中获取命令行参数会导致第二次要挂起的实例。

我想我需要session Sess;_tWinMain中,但把它放在那里会让我在client_functions.cpp上出错,因为它抱怨Sess未定义。

听起来您想要一个全局session实例由多个翻译单元共享。您可以做的是,在一个翻译单元/cpp文件中定义Sess,如下所示(假设这是您的main.cpp):

libtorrent::session Sess;

在其头文件(main.hpp)中,包括:

extern libtorrent::session Sess;

在任何其他想要使用会话的翻译单元/cpp文件中,确保包括头文件(main.hpp),然后您可以使用main.cpp 创建的实例

不要声明session Sess,而是声明session *Sess。这样,您就可以通过函数控制Sess的使用寿命。您可以在例如main()中创建它,并在最后执行的函数中销毁它。要创建它,请执行Sess = new session;;要销毁它,请进行delete Sess;

缺点是您必须用Sess->搜索/替换所有Sess.

顺便说一句,在每个文件中使用extern引用全局变量更合适,例如extern session *Sess,除了实际声明它的文件(可能是创建它的文件,例如来自main()的文件)。