集体前瞻性声明libtorrent

时间:2015-03-07 12:36:38

标签: c++ visual-studio libtorrent

我如何正确地向前宣布一个班级?

//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未定义。

2 个答案:

答案 0 :(得分:2)

听起来你想要一个由多个翻译单元共享的全局session实例。你可以做的是,在一个翻译单元/ cpp文件中 define Sess,就像这样(比如这是你的main.cpp):

libtorrent::session Sess;

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

extern libtorrent::session Sess;

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

答案 1 :(得分:1)

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

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

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